如何打印异常对象的堆栈跟踪,例如concurrent.futures.Future.exception()
的返回值?大多数traceback
和sys
异常函数都依赖于“当前正在处理”的隐式异常(包括sys.exc_info
,traceback.print_exc
,traceback.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()
的返回值?
答案 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)
但是,如果您不能注释第三方脚本,则可能无济于事。无论如何,它对我有帮助。