Python装饰器无异常时else块未执行的原因咨询
问题分析:为何try-else块未执行?
核心原因是try块中的return语句直接终止了try块的执行流程,导致else块被跳过。
Python的try-else逻辑规则很明确:只有当try块完整执行完毕(没有遇到return、break、continue这类提前退出块的语句)时,才会进入else块执行。而你的代码中,try块里直接写了return func(*arg, **kwargs)——当func正常返回时,这条return语句会立即触发返回流程:先计算并保存func的返回值,然后直接跳转到finally块执行,完全不会进入else块。
具体执行流程拆解
- 进入wrapper函数的try块,设置
errorFlag = True,打印error flag set as true - 调用
func(*arg, **kwargs)(即被装饰的foo函数,foo调用bar,bar正常返回) - 执行
return语句,此时程序会先保存func的返回结果,然后直接跳转到finally块 - finally块中
errorFlag仍为True,因此打印Error seen in finally - 函数返回,else块全程未被执行
修正方案
把return语句移到else块中,确保try块能完整执行后进入else,再触发返回:
from functools import wraps def handle_exceptions(func): @wraps(func) def wrapper(*arg, **kwargs): errorFlag = True try: print("error flag set as true") # 先保存函数执行结果,不直接return result = func(*arg, **kwargs) except Exception: raise else: print("else block hit") errorFlag = False # 在else块中返回结果 return result finally: if errorFlag: print("Error seen in finally") return wrapper def bar(): pass @handle_exceptions def foo(): bar() foo()
修正后的输出会变成:
error flag set as true else block hit
内容的提问来源于stack exchange,提问作者m.divya.mohan
相关产品推荐
相关产品推荐

