如何获取库方法捕获后重抛的原始异常?附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
相关产品推荐
相关产品推荐

