try/except/else/finally执行顺序与陷阱
请详细说明Python中try/except/else/finally四个子句的执行顺序和规则。在try/except/else/finally中分别出现return、break、continue或异常时,执行顺序如何变化?finally中的return会覆盖其他return吗?
回答
我是大山
标准执行顺序:
- 执行
try块 - 若
try抛异常且匹配except类型 → 执行except块 - 若
try未抛异常 → 执行else块 - 无论是否异常 → 执行
finally块
关键规则:
def test():
try:
return 'try'
finally:
return 'finally' # 覆盖try的return
print(test()) # 'finally'
finally中若有return/break/continue,会覆盖try或except中的返回finally中若抛出异常,会替换try中未处理或except中抛出的异常with语句本质上通过__enter__/__exit__实现资源管理,异常同步给__exit__
else最佳实践:将不会抛出异常的后续代码放在else中而非try中,避免意外捕获不想捕获的异常。
性能:try块本身没有性能开销,仅抛出异常时有。