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

如何获取库方法捕获后重抛的原始异常?附Python示例

如何获取被重新抛出的原始异常

一、可修改异常抛出代码的场景

如果你能控制重新抛出异常的逻辑(比如示例中的g()函数是你自己实现的),可以用Python的语法在抛出新异常时关联原始异常,从而可靠获取到原始异常。

使用raise 新异常 from 原始异常的写法,新异常会携带__cause__属性,指向原始异常。示例代码:

def f():
    raise KeyError("key not found")

def g():
    try:
        f()
    except Exception as e:
        # 关联原始异常后抛出新异常
        raise Exception(f'{e}') from e
    
try:
    g()
except Exception as exc:
    # 检查新异常的__cause__是否为KeyError
    if isinstance(exc.__cause__, KeyError):
        print('检测到原始KeyError异常')

二、无法修改第三方库代码的场景

如果抛出新异常的是第三方库方法,你无法修改其逻辑,只能通过新异常的错误消息做推测,但这种方式非常不可靠——因为库可能随时修改消息格式。

比如示例中新异常的消息包含了原始KeyError的内容,可以通过检查消息字符串判断:

def f():
    raise KeyError("key not found")

def g():
    try:
        f()
    except Exception as e:
        raise Exception(f'{e}')
    
try:
    g()
except Exception as exc:
    # 仅作为示例,依赖消息内容,不推荐在生产环境使用
    if "key not found" in str(exc) or "KeyError" in str(exc):
        print('推测发生了原始KeyError异常')

总结

  • 优先使用raise ... from ...关联原始异常,这是Python官方推荐的可靠方式,能完整保留异常链。
  • 若无法修改抛出逻辑,只能通过消息字符串猜测,但这种方式脆弱,不建议作为核心逻辑依赖。

内容的提问来源于stack exchange,提问作者m0hithreddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:33:20