Python:如何在没有“当前处理”异常的情况下打印异常对象的堆栈跟踪?

时间:2018-01-09 04:20:12

标签: python exception

如何打印异常对象的堆栈跟踪,例如concurrent.futures.Future.exception()的返回值?大多数tracebacksys异常函数都依赖于“当前正在处理”的隐式异常(包括sys.exc_infotraceback.print_exctraceback.format_exc)。该异常已被处理,并作为对象返回,因此这对我来说毫无价值。有几个traceback函数接受异常参数,但它们要么不提供堆栈跟踪输出,要么它们需要一个回溯对象作为输入,这是我没有的。我当然可以创建一个追溯对象,但该对象不包含我需要的信息。

是的,我知道这里有很多关于打印异常堆栈跟踪的问答。我仔细搜索过它们。这个问题与那些完全不同。

这是我正在尝试做的一个例子。

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    for idx in range(0, 10):
        future = executor.submit(third_party_script.main)
        threads.append(future)

for future in threads:
    if(future.exception()):
        print(magic_traceback_function(future.exception()))

如何打印异常对象的堆栈跟踪,例如concurrent.futures.Future.exception()的返回值?

3 个答案:

答案 0 :(得分:1)

您可以通过调用future.result()来获取引发的异常。据我所知,它也应包含原始追溯。因此,您可以通过将future.result()放入try块并打印回溯来捕获异常。还有__traceback__属性可能对您有所帮助。

答案 1 :(得分:1)

有一个exception方法,该方法返回调用引发的异常。因此,您可以像其他任何异常( Python 3.5 + )一样从中获得回溯。为此使用traceback.TracebackException(只需将ex替换为您的例外)即可:

print("".join(traceback.TracebackException.from_exception(ex).format())

扩展示例和其他实现此目的的功能

import traceback

try:
    1/0
except Exception as ex:
    print("".join(traceback.TracebackException.from_exception(ex).format()) == traceback.format_exc() == "".join(traceback.format_exception(type(ex), ex, ex.__traceback__)))
    print("".join(traceback.TracebackException.from_exception(ex).format()))

输出将类似于:

True
Traceback (most recent call last):
  File "untidsfsdfsdftled.py", line 29, in <module>
    1/0
ZeroDivisionError: division by zero

答案 2 :(得分:1)

我一直在为此苦苦挣扎,直到发现loguru可以实际使用@logger.catch批注来查看异常日志/堆栈跟踪(并且实际上以一种丰富多彩的方式!),如下所示:< / p>

@logger.catch
def other_script():
    ...

with concurrent.futures.ThreadPoolExecutor() as executor:
    for idx in range(0, 10):
        executor.submit(other_script)

但是,如果您不能注释第三方脚本,则可能无济于事。无论如何,它对我有帮助。