【问题标题】:Python code skips try/except clausePython 代码跳过 try/except 子句
【发布时间】:2016-10-28 01:20:20
【问题描述】:

我正在做一个课堂作业,我需要提出两个例外。 第一个异常:如果用户的输入小于 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)

【问题讨论】:

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


    【解决方案1】:

    听起来练习是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 传递和用户输入 - 通常异常会在用户最初提供文件名的地方被捕获和处理。所以在这个例子中,它可能是调用函数。

    【讨论】:

    • 我同意第一个是人为的,但它是针对家庭作业的。感谢您对第二个问题的谨慎,但再次,作业说“异常应该导致程序要求正确的文件名” - 文件名已经在程序的早期指定,但不是由用户指定。非常感谢
    【解决方案2】:

    对于您的第一个,您必须手动提升它,因为 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)

    【讨论】:

    • 你能修正你的缩进吗?此外,IOError 在 python 3 中仍然作为OSError 的同义词存在。
    • 感谢提醒,我的教科书使用 IO,但我宁愿使用更常用的术语。
    • Shady Atef,当我实现此代码时,我收到错误消息和新号码的请求。但随后发生与我之前的代码相同的事情:新号码未返回,打印时显示为“无”。
    • 这个想法是您使用递归调用,并且不返回第二个grade() 调用的值。第二个也是同样的情况
    【解决方案3】:

    试试这个:

    def get_value(data_list, index):
        return data_list[index]
    
    # Sample list data
    my_list = ['a', 'b', 'c']
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多