我目前正在尝试编写测验程序的第二部分,该程序使用简单函数load_quiz
加载包含测验数据的.json文件,如果找不到文件或是空它只会返回任何内容而拒绝参加测验。
我的代码如下:
def load_quiz():
quiz = None
try:
with open('quiz.json', 'r') as f:
quiz = json.load(f)
except (OSError, ValueError):
print("Quiz file not found/empty! Please load an unemptied quiz .JSON in order to play.")
return None
finally:
if quiz and quiz[playable]:
play_quiz(f)
else:
print("Quiz file invalid! Please load a valid .JSON in order to play.")
return None
我想知道这种方法是否有效。如果函数在None
块中返回except
,那么它仍会执行finally
块中的任何内容,或者该函数是否会停在那里?如果没有,那我该如何解决呢?
这是一个可行的选择吗?
答案 0 :(得分:2)
如果你有这个功能:
def divide(x, y):
try:
return x / y
except ZeroDivisionError:
return 0
finally:
print('always')
finally
将在没有例外的情况下执行:
>>> divide(1, 2)
always
0.5
并且在异常被引发并被捕获的情况下:
>>> divide(1, 0)
always
0
如您所见,always
在函数返回之前打印,即使return
在finally
之前可见。
答案 1 :(得分:2)
当
finally
语句的任何其他子句通过try
,break
或{{1}留下时,continue
子句也会在“出路”时执行声明。
https://docs.python.org/3.5/tutorial/errors.html#defining-clean-up-actions
答案 2 :(得分:1)
finally
块仍然被执行。实际上,它在执行except
块中的return语句之前执行。因此,您将从finally
块返回一个None值,而不是except
块。