Python代码跳过try / except子句

时间:2016-10-28 01:20:20

标签: python-3.x exception-handling try-except

我正在进行一项课程作业,我需要提出两个例外。 第一个例外:如果用户的条目小于0或大于100,我应该提出并处理异常。然后代码应该再次询问用户该数字。

第二个异常:如果找不到特定文件,该异常会请求文件名,然后再次搜索。

在这两种情况下,我都无法发生异常。换句话说,如果在第一个例外中,我输入一个大于100或小于0的数字,程序将继续并且根本不记录此条目的任何内容。如果我打印用户的条目,我得到“无”而不是应该显示except子句的错误消息。同样在第二个例外中,如果找不到该文件,代码只是停止执行而不是触发异常。

我已尝试手动引发异常(如此question/answer),但这会创建一个我不想要的回溯 - 我只想要第一个异常来打印错误消息并调用一个函数和第二个请求输入并调用函数。

第一个例外:

def grade():
    #input student's average grade
    avgGrade = int(input("Enter average grade: "))
    try:
        if avgGrade > 0 and avgGrade < 100:
            return avgGrade
    except ValueError:
        print("Grade must be numeric digit between 0 and 100")
        grade()

第二个例外:

def displayGrades(allStudents):
    try:
        #open file for input
        grade_file = open(allStudents, "r")

        #read file contents
        fileContents = grade_file.read()

        #display file contents
        print(fileContents)

        grade_file.close()

    except IOError:
        print("File not found.")
        allStudents = input("Please enter correct file name: ")
        displayGrades(allStudents)

2 个答案:

答案 0 :(得分:2)

听起来好像是raise例外并处理它。你真的需要一个循环来继续而不是递归,例如:

def grade():
    while True:
        try:
            avgGrade = int(input("Enter average grade: "))
            if avgGrade < 0 or avgGrade > 100:
                raise ValueError()
        except ValueError:
            print("Grade must be numeric digit between 0 and 100")
            continue # Loop again
        break # Exit loop
    return avgGrade

但这是为了例外的目的,因为在这种情况下并不需要例外。

对于你的另一个例子,这个设计较少,因为下游函数会引发异常,例如:

def displayGrades(allStudents):
    while True:
        try:
            with open(allStudents, "r") as grade_file:
               ...
        except IOError:
            allStudents = input("Please enter correct file name: ")
            continue
        break

虽然我会谨慎地将arg传递和用户输入混合在同一个函数中 - 通常会在用户最初提供文件名的位置捕获并处理异常。所以在这个例子中,它可能是调用函数。

答案 1 :(得分:1)

对于你的第一个,你必须手动提升它,因为python不会猜测你的逻辑并为你提升它。

def grade():
    #input student's average grade
    avgGrade = int(input("Enter average grade: "))
    try:
        if avgGrade > 0 and avgGrade < 100:
            return avgGrade
        else:
            raise ValueError()      
    except ValueError:
        print("Grade must be numeric digit between 0 and 100")
        return grade()

对于第二个,您必须在第二个调用中返回该值。 使用return displayGrades(allStudents)代替displayGrades(allStudents)