Python中为什么finally会被执行两次?

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

fancy_divide([0, 2, 4], 4)

结果是1 0 01 0我理解,但为什么最后还有个 0 呢?finally被执行两次?


Python中为什么finally会被执行两次?

9 回复

递归完了才会执行第一次的 finally


我无法理解你的问题。

你第一次触发了 IndexError,在处理完 IndexError 异常后是会调用 finally,加上 fancy_divide(numbers, len(numbers) - 1)里执行的 finally,总共两次 finally 没问题呀。

其实打个断点就能知道了

或者这么理解,finally 一定会执行,你这个函数调用了两次,那肯定会执行两次。

第一次执行触发 indexerror,然后再递归执行一次,第二次正常执行,打印 else 里的 1,打印 finally 里的 0,然后回到第一次执行的函数里,打印 finally 里的 0。

finally 的含义是不管函数是否抛出异常都会执行。

另外,建议这种问题用单步调试来看每一步执行过程,比较容易理解

递归啊,1 0 都理解,最后的 0 更好理解了嘛

原来如此,感谢大家!

递归里面还是 call 了一遍 finally

回到顶部