You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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块。

具体执行流程拆解

  1. 进入wrapper函数的try块,设置errorFlag = True,打印error flag set as true
  2. 调用func(*arg, **kwargs)(即被装饰的foo函数,foo调用bar,bar正常返回)
  3. 执行return语句,此时程序会先保存func的返回结果,然后直接跳转到finally块
  4. finally块中errorFlag仍为True,因此打印Error seen in finally
  5. 函数返回,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:23:13