2

在一个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))

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

有没有更蟒蛇的方式来做到这一点?我想要的只是摆脱嘈杂的(在我的情况下是无用的)追溯,同时保留异常对象中包含的信息..

4

1 回答 1

4

在 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"

它当然仍会显示到行的跟踪,因为它是在异常传播时添加的(再次)。

于 2018-06-09T19:23:25.463 回答