在抛出之前处理异常的堆栈跟踪(Python)

时间:2019-02-20 07:43:14

标签: python python-3.x

我正在使用Python的惰性评估库,该库允许用户编写普通代码,而稍后再对其进行评估。一个问题是异常非常混乱。这就是为什么我想使用修改后的堆栈跟踪引发异常。看起来好像该异常是在完全没有惰性求值的情况下触发的(或者只是带有简短提示)。

这是我已经尝试过的。我没有找到一种更好的方法来进行回溯,但如果可能的话,我宁愿不要在create_tb中抛出异常。

import sys

def create_tb():  # Capture the stack trace
  try:
    raise Exception("A")
  except:
    _, _, tb = sys.exc_info()
    return tb


def raise_with_tb(tb):  # It should look like "B" was triggered in create_tb
  raise Exception("B").with_traceback(tb)


tb = create_tb()
raise_with_tb(tb)

但是输出是:

Traceback (most recent call last):
  File ".../test.py", line 16, in <module>
    raise_with_tb(tb)
  File ".../test.py", line 12, in raise_with_tb
    raise Exception("B").with_traceback(tb)
  File ".../test.py", line 5, in create_tb
    raise Exception("A")
Exception: B

代替类似的东西

Traceback (most recent call last):
  File ".../test.py", line 5, in create_tb
    raise Exception("B")
Exception: B

这可能吗?

我对Python比较陌生。如果有更多的植物实现目标的方法,我很乐意提出建议。

1 个答案:

答案 0 :(得分:0)

我发现了一种抑制以前发生的异常的方法:

try:
    raise Exception('original exception message')
except Exception as exc:
    my_custom_exception = Exception('my custom message')
    my_custom_exception.__suppress_context__ = True
    raise my_custom_exception

它提供以下回溯:

Traceback (most recent call last):
  File "ex.py", line 6, in <module>
    raise my_custom_exception
Exception: my custom message

用行my_custom_exception.__suppress_context__ = True注释回溯也有以前的异常:

Traceback (most recent call last):
  File "ex.py", line 2, in <module>
    raise Exception('original exception message')
Exception: original exception message

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "ex.py", line 6, in <module>
    raise my_custom_exception
Exception: my custom message

但是我不确定1)是pythonic方式2)确实是您所需要的。