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

如何在pytest中重新抛出异常时隐藏原始异常?

解决pytest显示超长库回溯的问题

核心问题在于你使用了raise MyError(e) from e语法,这会让Python将原始异常标记为新异常的直接原因,pytest默认会展开整个异常链的回溯信息。要只保留自定义MyError的简短回溯,有两种实用方案:

方案一:移除from e(最简单直接)

修改你的异常抛出逻辑,去掉from e部分:

def _command(self, lib_handler, cmd):
    try:
        lib_handler.run(cmd)
    except Exception as e:
        raise MyError(str(e))

这样Python不会关联原始异常,pytest只会打印MyError的调用栈,完全不会展示库的深层回溯。如果需要保留原始异常的提示信息,把e转成字符串传入MyError即可,和你原本的需求一致。

方案二:保留异常链但抑制原始回溯

如果不想完全切断异常链(比如后续调试可能需要追溯根源),可以通过两种方式实现:

  • 手动设置新异常的__suppress_context__属性为True
  • 使用raise MyError(e) from None语法

代码示例:

def _command(self, lib_handler, cmd):
    try:
        lib_handler.run(cmd)
    except Exception as e:
        # 方式1:设置suppress属性
        err = MyError(str(e))
        err.__suppress_context__ = True
        raise err
        
        # 方式2:使用from None
        # raise MyError(str(e)) from None

from None会告诉Python不要将原始异常作为新异常的触发原因,同样能让pytest只显示MyError的回溯,同时你仍能在自定义异常中保留原始异常的关键信息。

如果仅需在pytest测试场景中隐藏原始回溯,也可以通过pytest配置添加过滤规则,但上述代码层面的方案更通用,在测试和生产环境均能生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:42:33