我的代码有点问题,主要是(我认为)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/