在Python

时间:2015-09-17 22:26:10

标签: python nested try-except

def FancyDivide(numbers, index):
try:
    try:
        denom = numbers[index]
        for i in range(len(numbers)):
            numbers[i] /= denom
    except IndexError, e:
        FancyDivide(numbers, len(numbers) - 1)
    else:
        print "1"
    finally:
        print "0"
except ZeroDivisionError, e:
    print "-2"

功能输出

>>> FancyDivide([0, 2, 4], 0)
0
-2

我希望只有-2作为答案,但为什么是0.根据我的说法ZeroDivisionError应该被last语句捕获,因此答案应该是-2。困惑。请帮助。

2 个答案:

答案 0 :(得分:1)

无论是否抛出finallyException块都会执行。

如果您的代码在嵌套的try中抛出异常,则关联的finally块将在外部except之前执行。

答案 1 :(得分:1)

你是对的,ZeroDivisionError 被外try块捕获,但finally子句始终执行,然后才离开相应的try块(即使在其中引发异常)。

因此,在您的情况下,内部try引发异常,执行内部finally,然后外部try捕获异常。

此处有更多信息:https://docs.python.org/2/tutorial/errors.html#defining-clean-up-actions