finally 一定会执行,因为 Python 解释器在字节码层面通过 SETUP_FINALLY 和 END_FINALLY 指令强制保障其执行,无论 return、break、未捕获异常或 sys.exit(),只要程序进入 try 块且未被 kill -9 等强制终止,finally 必执行。

因为 Python 解释器在字节码层面强制插入了 finally 的执行路径,不是靠逻辑判断,而是靠运行时栈帧退出机制保障的。
finally 不是“大概率会执行”,而是解释器级硬性语义
只要程序进入 try 块开始执行,对应的 finally 就被解释器注册为 cleanup 钩子。CPython 生成 SETUP_FINALLY 指令,在栈帧销毁前触发 END_FINALLY,无论控制流怎么跳(return、break、未捕获异常、sys.exit()),只要 Python 还能调度,就一定会走到这一步。
这不是程序员写的逻辑兜底,而是字节码层的强制约定——你甚至可以在 finally 里写 return,它会覆盖 try 或 except 中的返回值。
常见误判场景:你以为跳过了,其实没跳
-
try块里写了return "done",finally里写了print("cleanup")→ 会先打印再返回 -
try抛出ValueError,外面没except→ 异常仍向上抛,但finally在抛出前就已执行 -
sys.exit(0)在try中 → 进程退出前,finally仍会执行(除非被kill -9强杀)
真正跳过 finally 的唯一情况
只有两种:try 块根本没开始执行(比如进程启动失败、导入模块时报错卡在 import 阶段),或者 finally 自己执行到一半被外部强制终止(断电、kill -9、内核 panic)。正常 Python 控制流下,不存在“忘记执行”或“条件不满足就不执行”的可能。
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
立即学习“Python免费学习笔记(深入)”;
和 with 语句的关系:底层就是 try-finally
with open("x.txt") as f: 展开后本质就是 try + finally:打开文件后注册 f.close() 到 finally 块。所以 with 安全,是因为 finally 可靠;而 finally 可靠,是因为解释器不信任人,只信任字节码指令。
真正容易被忽略的点是:finally 里抛异常会吞掉原异常,且 return 会劫持返回值——这不是 bug,是设计使然,用之前得想清楚清理逻辑是否允许中断主流程。

















