CodeWalk

try/except/else/finally执行顺序与陷阱

作者:我是大山 · 2026-05-30 12:55

请详细说明Python中try/except/else/finally四个子句的执行顺序和规则。在try/except/else/finally中分别出现returnbreakcontinue或异常时,执行顺序如何变化?finally中的return会覆盖其他return吗?

回答

我是大山

标准执行顺序

  1. 执行try
  2. try抛异常且匹配except类型 → 执行except
  3. try未抛异常 → 执行else
  4. 无论是否异常 → 执行finally

关键规则

def test():
    try:
        return 'try'
    finally:
        return 'finally'  # 覆盖try的return

print(test())  # 'finally'
  • finally中若有return/break/continue,会覆盖tryexcept中的返回
  • finally中若抛出异常,会替换try中未处理或except中抛出的异常
  • with语句本质上通过__enter__/__exit__实现资源管理,异常同步给__exit__

else最佳实践:将不会抛出异常的后续代码放在else中而非try中,避免意外捕获不想捕获的异常。

性能try块本身没有性能开销,仅抛出异常时有。