函数中的Try / Except块在异常时返回None:这仍然会运行Finally块吗?

时间:2015-12-13 20:50:17

标签: python python-3.x

我目前正在尝试编写测验程序的第二部分,该程序使用简单函数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块中的任何内容,或者该函数是否会停在那里?如果没有,那我该如何解决呢?

这是一个可行的选择吗?

3 个答案:

答案 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在函数返回之前打印,即使returnfinally之前可见。

答案 1 :(得分:2)

  

finally语句的任何其他子句通过trybreak或{{1}留下时,continue子句也会在“出路”时执行声明。

https://docs.python.org/3.5/tutorial/errors.html#defining-clean-up-actions

答案 2 :(得分:1)

finally块仍然被执行。实际上,它在执行except块中的return语句之前执行。因此,您将从finally块返回一个None值,而不是except块。