You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中finally块抛出异常是否优先于except块重抛的异常?

问题解答

是的,这个行为是Python官方明确保证的——finally块中抛出的异常会覆盖try/except流程中原本要抛出的异常。

具体执行逻辑

你的代码运行时的流程如下:

  1. try块抛出Exception('1'),触发except分支
  2. except块里的raise语句将原异常标记为待抛出状态,但不会立刻向外传播
  3. 进入finally块执行,这里抛出了Exception('2')——此时Python会直接丢弃之前待抛出的Exception('1'),把新抛出的Exception('2')作为最终向外传播的异常

官方规则依据

Python的执行模型明确规定:如果在finally子句执行期间抛出了新的异常,那么之前try/except流程中产生的待抛出异常会被隐式丢弃,新异常会成为当前的活跃异常。只有当finally块正常执行完毕(没有抛出异常),原来的异常才会继续传播。

补充验证

如果把finally块里的raise Exception('2')注释掉,运行代码就会正常抛出Exception('1'),这也能反向验证上述规则。

内容的提问来源于stack exchange,提问作者nonagon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:45:55