finally块总是执行,且在try或except的return生效前运行;无异常时执行try→finally;有匹配except时执行try→except→finally;无匹配except时执行try→finally后异常冒泡;finally中return会覆盖原返回值。

python 中 try、except、finally 的执行顺序,核心在于:无论是否发生异常、是否被捕获、是否提前返回,finally 块**总是会执行**,且在 try 或 except 中的 return 语句“生效前”运行。
基本执行流程(无异常)
当 try 块中代码正常执行完毕,不抛出异常时:
- 先执行
try块全部语句 - 跳过所有
except块(不进入) - 再执行
finally块 - 最后继续执行后续代码(或函数返回)
发生异常且被 except 捕获
当 try 中某行抛出异常,且有匹配的 except 时:
- 执行到异常发生处,立即停止
try后续语句 - 跳转至匹配的
except块,执行其中代码 -
except执行完后,立刻执行finally块 - 再继续执行
finally之后的代码
发生异常但未被 except 捕获
当 try 抛出异常,又没有匹配的 except 时:
-
try中异常发生后立即中断 - 跳过所有
except块 - 仍会执行
finally块(这是关键!) -
finally执行完后,异常继续向上冒泡(原样抛出)
return 遇上 finally 的细节
如果 try 或 except 中有 return,实际返回值的确定和 finally 的关系容易混淆:
-
try中有return x:先记录返回值x,再执行finally -
finally中若也有return y,则直接返回y,覆盖之前记录的值 -
finally中若没有return,但修改了可变对象(如列表、字典),会影响返回结果 -
finally中抛出新异常,会取代原异常(原异常丢失)
理解这个顺序的关键是记住:finally 是清理阶段的“最终保障”,它插在任何退出路径(正常结束、异常中断、return 返回)之前执行,且拥有对返回值和异常的最终决定权。