代码之家  ›  专栏  ›  技术社区  ›  frans

如何在没有回溯的情况下重新引发相同的异常?

  •  1
  • frans  · 技术社区  · 7 年前

    在一个 except 阻止我要引发相同的异常,但 没有 堆栈跟踪和 没有 作为另一个异常的直接原因引发此异常的信息。(无需修改 sys.tracebacklimit 全球)

    另外,我还有一个非常笨拙的异常类,它解析和修改消息文本,这样我就不能只复制它。

    我目前的方法是

    try:
        deeply_nested_function_that_raises_exception()
    except ClumsyExceptionBaseClass as exc:
        cls, code, msg = exc.__class__, exc.code, exc.msg
    raise cls("Error: %d %s" % (code, msg))
    

    我在这里做的是 排版 异常信息, 重新组装 一个新的异常,其中的消息将在构造函数中被解析并拆分为错误代码和消息并引发它 从外面 除了 以便忘记所有跟踪信息。

    有没有比这更像蟒蛇的方法?我所需要的就是在保留异常对象中包含的信息的同时,去掉那些嘈杂的(在我的例子中是无用的)跟踪。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Davis Herring    7 年前

    在python 3中,可以使用 with_traceback 要删除迄今为止累积的回溯条目:

    try: ...
    except Exception as e:
      raise e.with_traceback(None)
    

    在python 2中,它只是

    try: ...
    except Exception as e:
      raise e   # not just "raise"
    

    当然,它仍然会显示出 行,因为在异常传播(再次)时添加了_。