Python中finally块抛出异常是否优先于except块重抛的异常?
问题解答
是的,这个行为是Python官方明确保证的——finally块中抛出的异常会覆盖try/except流程中原本要抛出的异常。
具体执行逻辑
你的代码运行时的流程如下:
- try块抛出
Exception('1'),触发except分支 - except块里的
raise语句将原异常标记为待抛出状态,但不会立刻向外传播 - 进入finally块执行,这里抛出了
Exception('2')——此时Python会直接丢弃之前待抛出的Exception('1'),把新抛出的Exception('2')作为最终向外传播的异常
官方规则依据
Python的执行模型明确规定:如果在finally子句执行期间抛出了新的异常,那么之前try/except流程中产生的待抛出异常会被隐式丢弃,新异常会成为当前的活跃异常。只有当finally块正常执行完毕(没有抛出异常),原来的异常才会继续传播。
补充验证
如果把finally块里的raise Exception('2')注释掉,运行代码就会正常抛出Exception('1'),这也能反向验证上述规则。
内容的提问来源于stack exchange,提问作者nonagon
相关产品推荐
相关产品推荐

