繁体   English   中英

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

[英]How to re-raise the same exception without the traceback?

在一个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块外部引发它以便忘记所有跟踪信息。

是否有更多的pythonic方式来做到这一点? 我想要的只是在保留异常对象中包含的信息的同时摆脱嘈杂(在我的情况下无用)跟踪。

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

它当然仍会显示到这一行的跟踪,因为随着异常的传播(再次),它会被添加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM