【问题标题】:Python 3 try except issuePython 3 尝试除了问题
【发布时间】:2014-03-29 17:00:51
【问题描述】:

我的代码有一点问题,主要是(我认为)try/except 部分。我的代码将生成用户选择的单词表。代码如下:

def gen_wordlist():
    filename = input("Please enter the name of the wordlist:  ")

    try:
        my_file = open(filename, 'r')

    except FileNotFoundError:
        retry = input("No file named "+filename+". Would you like to try again (y/n)")
        if retry == 'y' or retry == 'Y':
            gen_wordlist()
        else:
            print("Goodbye :-)")
            sys.exit()

    words = my_file.read()
    my_file.close()
    return(words.split())


words = gen_wordlist()

如果我在第一次尝试时输入了一个有效的文件名,它就会正常工作。但是,如果我输入了一个无效的文件名并选择重试,我会收到以下错误,即使我的第二次尝试肯定是一个有效的文件名:

Traceback (most recent call last):
  File "TEST.py", line 20, in <module>
    words = gen_wordlist()
  File "TEST.py", line 15, in gen_wordlist
    words = my_file.read()
UnboundLocalError: local variable 'my_file' referenced before assignment

我不知道为什么。当然,当我选择'y' 时,代码只是从gen_wordlist() 函数的开头执行,并且应该像我在第一次尝试时输入了一个有效的文件名一样工作,对吧?

【问题讨论】:

    标签: python python-3.x try-catch except


    【解决方案1】:

    如果open() 调用引发FileNotFoundError 异常,则永远不会设置my_file,并且尝试使用该名称的所有其他引用都将失败。

    包括在异常处理程序中调用gen_wordlist() 之后的代码。当然,新的调用可能会成功,但该调用随后返回回到my_file 未设置的帧

    你也想回到这里,而不是:

    if retry == 'y' or retry == 'Y':
        return gen_wordlist()
    

    否则你也会忽略这里递归调用成功的结果。

    使用递归来处理用户输入中的错误并不是一个好主意。改用循环:

    my_file = None
    
    while my_file is None:
        filename = input("Please enter the name of the wordlist:  ")
    
        try:
            my_file = open(filename, 'r')
        except FileNotFoundError:
            retry = input("No file named " + filename + ". Would you like to try again (y/n)")
            if retry.lower() == 'y':
                # back to the top of the loop
                continue
    
            print("Goodbye :-)")
            sys.exit()
    

    while 循环将一直运行,直到my_file 已成功设置为文件对象。

    【讨论】:

      【解决方案2】:

      重新阅读错误信息,它清楚地表明您在赋值之前使用了变量my_file。现在,看看你的代码,你什么时候在except 子句中定义my_file?如果出现错误,try 会在没有声明/分配给my_file 变量的情况下退出。休息一下,Martijn 的回答指出了更多的问题。

      【讨论】:

        猜你喜欢
        • 2015-01-25
        • 2019-02-21
        • 2013-04-25
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 2019-01-29
        相关资源
        最近更新 更多