finally块几乎总执行,但os._exit()、SIGKILL、解释器崩溃或断电等硬中断会跳过;sys.exit()仍触发finally;try/except中return后finally仍执行并可覆盖返回值。
Python finally 块在绝大多数情况下都会执行
是的,finally 块设计初衷就是「无论是否发生异常、是否提前 return、break 或 continue」,都要执行。这是它和 else(仅无异常时执行)最根本的区别。
但“一定”要加引号——存在极少数绕过它的场景,不是语言缺陷,而是 Python 运行时被强制终止的结果。
哪些情况会导致 finally 不执行
真正跳过 finally 的,是那些让解释器来不及跑完清理逻辑的硬性中断:
-
os._exit():直接退出进程,不触发任何 Python 级别的清理(包括finally、__del__、atexit) - 外部信号强制终止:比如
kill -9(SIGKILL),操作系统直接杀掉进程 - Python 解释器崩溃:如 C 扩展引发段错误(segfault)
- 电源断电、系统死机等物理级故障
注意:sys.exit() 会触发 finally,因为它只是抛出 SystemExit 异常,仍走正常异常处理流程。
立即学习“Python免费学习笔记(深入)”;