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显式关联因果异常,增强可读性。
立即学习“Python免费学习笔记(深入)”;
-
raise(无参数):原样重抛当前异常,保留原始 traceback -
raise ValueError("new msg"):抛出新异常,原始 traceback 断开 -
raise NewError("failed") from orig_exc:保留原始异常为__cause__,便于调试
finally 不会阻止异常传播
即使函数中有finally块,其中的代码总会执行,但若finally里没有except,异常仍继续冒泡。
-
finally适合做清理工作(如关闭文件、释放锁) - 若
finally中又抛出新异常,它会覆盖前面的异常(除非原异常尚未离开except块) - 避免在
finally中无条件raise,否则可能掩盖真正问题









