Python 3.x Python代码跳过try/except子句

Python 3.x Python代码跳过try/except子句,python-3.x,exception-handling,try-except,Python 3.x,Exception Handling,Try Except,我正在做一个课堂作业,我需要提出两个例外。 第一个异常:如果用户的条目小于0或大于100,我应该引发并处理一个异常。然后,代码应再次向用户询问数字 第二个异常:如果找不到特定文件,异常会请求文件名,然后再次进行搜索 在这两种情况下,我都不能让例外发生。换句话说,如果在第一个异常中,我输入了一个大于100或小于0的数字,那么程序将继续,并且根本不记录该输入的任何内容。如果我打印用户的条目,我会得到“none”,而不是except子句应该显示的错误消息。同样,在第二个异常中,如果找不到文件,代码将停

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

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

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

我尝试手动引发一个异常(如下所示),但这会创建一个我不想要的回溯——我只希望第一个异常打印错误消息并调用函数,第二个异常请求输入并调用函数

第一个例外:

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)

对于第一个,您必须手动提升它,因为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()
def grade():
#输入学生的平均成绩
avgGrade=int(输入(“输入平均等级:”)
尝试:
如果avgGrade>0且avgGrade<100:
返回平均值
其他:
提升值错误()
除值错误外:
打印(“等级必须是介于0和100之间的数字”)
返回等级()
对于第二个调用,必须在第二个调用中返回值。
使用
returndisplaygrades(allstudent)
而不是
displayGrades(allStudents)
听起来像是要
引发异常并处理它。您确实需要一个用于继续而不是递归的循环,例如:

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

虽然我会提醒在同一个函数中混合参数传递和用户输入-通常在用户最初提供文件名的地方捕获和处理异常。因此,在本例中,它可能是调用函数。

您能修复缩进吗?另外,
IOError
在python 3中仍然作为
OSError
的同义词存在。感谢大家的提醒,我的教科书使用IO,但我宁愿使用更常见的术语。Shady Atef,当我实现这段代码时,我会收到错误消息和请求一个新数字。但是,与我之前的代码一样,发生了同样的事情:新的数字不会返回,并且在打印时显示为“none”。其思想是使用递归调用,并且不返回第二次
grade()
调用的值。第二个也是一样。我同意第一个是人为的,但它是针对家庭作业的。感谢第二条上的警告,但同样,作业说明“异常应导致程序要求正确的文件名”--文件名已在程序的前面指定,但不是由用户指定的。多谢