python 异常自动向上层调用栈传播直至被捕获或终止程序,即“异常冒泡”;未捕获异常逐层返回调用点,触发 traceback 并退出;raise 可重抛或新建异常,finally 执行清理但不阻止冒泡。

Python 中异常会自动向上层调用栈传播,直到被 try/except 捕获,或到达最外层导致程序终止——这就是“异常冒泡”机制。
异常从函数内部向外逐层传递
当函数 A 调用函数 B,B 中抛出未捕获的异常时,该异常不会停留在 B 内,而是“冒泡”回 A 的调用点。若 A 也未处理,异常继续向更外层传播。
- 函数内部不捕获异常 → 异常立即返回到调用它的地方
- 调用链越长,异常可能穿越多个函数层级
- 只要中间任一函数用
try/except捕获并处理,冒泡就停止
未捕获异常最终触发程序中断
如果异常一路传到主模块(如脚本顶层)仍未被捕获,Python 将打印完整的 traceback 并退出当前线程(主线程则终止整个程序)。
- traceback 显示异常类型、消息及每一层调用位置
- 即使函数有
return语句,一旦中途抛异常,后续代码不执行 - 例如:
def f(): raise ValueError("boom"); return 42中return永远不会运行
主动控制冒泡:raise 和 raise from
可以在 except 块中选择重新抛出异常,延续冒泡过程;也可用 raise …… from 显式关联因果异常,增强可读性。
-
raise(无参数):原样重抛当前异常,保留原始 traceback -
raise ValueError("new msg"):抛出新异常,原始 traceback 断开 -
raise NewError("failed") from orig_exc:保留原始异常为__cause__,便于调试
finally 不会阻止异常传播
即使函数中有 finally 块,其中的代码总会执行,但若 finally 里没有except,异常仍继续冒泡。
-
finally适合做清理工作(如关闭文件、释放锁) - 若
finally中又抛出新异常,它会覆盖前面的异常(除非原异常尚未离开except块) - 避免在
finally中无条件raise,否则可能掩盖真正问题






























