finally 子句由 python 解释器强制保障执行,无论 try 块中发生异常、return/break/continue、sys.exit() 或未捕获异常,只要进入 try 就必执行;唯一跳过情形是程序在 try 前终止或 finally 中被外部强制杀死。

因为 finally 子句的设计目的就是保证其代码无论是否发生异常、是否提前返回,都会被执行。这是 Python 异常处理机制的硬性语义约定,由解释器底层强制保障。
执行时机不受控制流干扰
只要 try 子句开始执行,对应的 finally 就一定会运行,哪怕遇到以下情况:
- return、break 或 continue 跳出 try 块(包括在 except 或 else 中)
- try 块中抛出未被捕获的异常(异常传播前先执行 finally)
- try 块中调用了 sys.exit()(仍会执行 finally,除非进程被强制终止)
- try 块中发生致命错误(如内存耗尽),但只要 Python 还能调度,finally 仍尝试执行
不是“逻辑上总会走到”,而是解释器级保障
它不依赖程序员写对了流程,也不是靠条件判断实现的。CPython 在字节码层面为 try...finally 生成专用指令(如 SETUP_FINALLY、POP_BLOCK、END_FINALLY),在栈帧退出前插入 finally 的执行路径。即使你没写 except,只要写了 finally,解释器就把它当作 cleanup 钩子强制注册。
唯一真正跳过 finally 的情况
只有当程序在进入 try 块之前就终止,或在 finally 执行过程中被外部强制杀死(如 kill -9、断电、内核崩溃),才可能跳过。正常 Python 控制流下,finally 是最可靠的清理代码放置位置。
立即学习“Python免费学习笔记(深入)”;
典型用途:资源必须释放
比如打开文件、获取锁、启动线程等操作,用 finally 可避免因疏忽或异常导致泄漏:
- 文件操作:
f = open(...)后在 finally 中f.close() - 数据库连接:确保
conn.rollback()或conn.commit()后一定conn.close() - 上下文管理器(with)底层正是基于 try/finally 实现的









