Python 3 尝试排除问题

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

我的代码有点问题,主要是(我认为)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() 函数的开头执行,并且应该像我输入了有效文件名一样工作第一次尝试,对吧?

最佳答案

如果 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 已成功设置为文件对象。

关于Python 3 尝试排除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22048636/

相关文章:

python - 我怎样才能让 Homebrew 的 python 和 pyenv 一起生活?

python - 内存中列表的大小

java - 从对象列表中查找最后一个对象,如果没有找到则抛出异常

macos - 在 OS X 上为 Python 3 安装 PyAudio

python - 在 defaultdict 中使用构造函数是否有效

c# - 捕获后继续尝试 block 。在一个 try catch 中记录所有异常

java - 了解 try & catch 以及错误处理

python - pandas dataframe 分级数据绘图

python - bitfinex api v2 错误,无效 key

python - 不使用小部件 tk.Menu 的自定义菜单栏