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。困惑。请帮助。
答案 0 :(得分:1)
无论是否抛出finally
,Exception
块都会执行。
如果您的代码在嵌套的try
中抛出异常,则关联的finally
块将在外部except
之前执行。
答案 1 :(得分:1)
你是对的,ZeroDivisionError 将被外try
块捕获,但finally
子句始终执行,然后才离开相应的try
块(即使在其中引发异常)。
因此,在您的情况下,内部try
引发异常,执行内部finally
,然后外部try
捕获异常。
此处有更多信息:https://docs.python.org/2/tutorial/errors.html#defining-clean-up-actions