Python try except finally 执行顺序详解

1次阅读

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

Python try except finally 执行顺序详解

pythontryexceptfinally 的执行顺序,核心在于:无论是否发生异常、是否被捕获、是否提前返回,finally 块**总是会执行**,且在 tryexcept 中的 return 语句“生效前”运行。

基本执行流程(无异常)

try 块中代码正常执行完毕,不抛出异常时:

  • 先执行 try 块全部语句
  • 跳过所有 except 块(不进入)
  • 再执行 finally
  • 最后继续执行后续代码(或函数返回)

发生异常且被 except 捕获

try 中某行抛出异常,且有匹配的 except 时:

  • 执行到异常发生处,立即停止 try 后续语句
  • 跳转至匹配的 except 块,执行其中代码
  • except 执行完后,立刻执行 finally
  • 再继续执行 finally 之后的代码

发生异常但未被 except 捕获

try 抛出异常,又没有匹配的 except 时:

  • try 中异常发生后立即中断
  • 跳过所有 except
  • 仍会执行 finally 块(这是关键!)
  • finally 执行完后,异常继续向上冒泡(原样抛出)

return 遇上 finally 的细节

如果 tryexcept 中有 return,实际返回值的确定和 finally 的关系容易混淆:

  • try 中有 return x:先记录返回值 x,再执行 finally
  • finally 中若也有 return y,则直接返回 y,覆盖之前记录的值
  • finally 中若没有 return,但修改了可变对象(如列表、字典),会影响返回结果
  • finally 中抛出新异常,会取代原异常(原异常丢失)

理解这个顺序的关键是记住:finally 是清理阶段的“最终保障”,它插在任何退出路径(正常结束、异常中断、return 返回)之前执行,且拥有对返回值和异常的最终决定权。

text=ZqhQzanResources