Python中try-except-finally结构finally块内外return的区别
两段Python代码的核心差异解析
两段代码的前半段执行逻辑完全一致:
- 进入
try块后首先打印A,主动抛出ArithmeticError - 异常被
except块捕获后打印B,此时在except块内主动抛出AssertionError - 按照Python语法规则,
finally块无论是否有未处理异常都会执行,所以两段代码都会执行打印C的逻辑
两者的核心差异就在于finally块内是否包含return语句:
第一段代码的
finally块带有return
Python语法规定:如果finally块中执行了return、break这类会直接跳转控制流的语句,那么之前在try/except块中产生的所有未抛出的异常都会被直接丢弃。也就是说except里抛出的AssertionError还没来得及传到函数外部,就被finally的return直接打断,函数正常结束返回,所以外部看不到任何异常。第二段代码的
finally块没有returnfinally块执行完打印C的逻辑后,没有控制流语句打断待抛出的异常,所以except块里抛出的AssertionError会继续向上传递到函数调用方,因此运行时会看到异常抛出。
简单总结:finally块中的return会静默吞噬所有待抛出的未处理异常,没有return时异常会正常向外传递,这就是两段代码一个抛异常一个不抛的核心原因。
内容的提问来源于stack exchange,提问作者user3267989
相关产品推荐
相关产品推荐

