不一定。finally 块在 try 或 except 中遇 return、break、continue 时仍执行,但若其自身 return 或抛异常,则覆盖前面返回值或异常;嵌套时按内层到外层顺序执行。

try/except/finally 执行时,finally 一定最后运行吗?
不一定。finally 块在 try 或 except 中遇到 return、break、continue 时仍会执行,但它不是“程序退出前最后执行的代码”——如果 finally 自己也 return 或抛出异常,它会覆盖前面的返回值或异常。
try 中 return 后,except 和 finally 谁先触发?
如果 try 块里有 return,且没发生异常,except 完全不执行;finally 会在 return 的值被确定后、实际返回前立即执行。
-
try中return 42→ 值 42 被暂存 - 接着执行
finally块(哪怕它也写return 99) - 若
finally无return,函数最终返回 42;若有,则返回 99,原 42 被丢弃
finally 抛出异常会吞掉 try/except 的错误吗?
会。即使 try 抛了异常、except 已捕获并处理,只要 finally 再抛异常,整个函数就只往外冒 finally 的那个异常,前面的被彻底掩盖。
-
try中触发ZeroDivisionError -
except ZeroDivisionError里打印日志、正常结束 -
finally里写了raise ValueError("cleanup failed") - 调用方收到的是
ValueError,不是原始的ZeroDivisionError
嵌套 try/finally 时的执行顺序怎么算?
按栈结构倒序触发:最内层 finally 先执行,外层后执行。但每层都严格遵循“try/except 结束 → 当前层 finally 立即执行”规则。
立即学习“Python免费学习笔记(深入)”;
例如:
try:
try:
raise KeyError()
except KeyError:
print("inner except")
finally:
print("inner finally") # 先输出
finally:
print("outer finally") # 后输出
输出顺序是:inner except → inner finally → outer finally。注意:inner finally 在 inner except 执行完后立刻跑,不等外层逻辑。
最容易忽略的是 finally 里的 return 或异常——它们不是“收尾动作”,而是能中途劫持控制流的主动语句。









