如何在Python中打印异常对象的堆栈跟踪信息?

32

如何在Python中打印异常对象的堆栈跟踪?

请注意,该问题并非关于打印最后一个异常的堆栈跟踪。异常对象可能保存在过去某个遥远的时间点。


2
类似:https://dev59.com/ZHA65IYBdhLWcg3wqQY8 - user202729
2个回答

46

虽然有点麻烦,但您可以使用 traceback.print_exception。给定一个异常 ex

traceback.print_exception(type(ex), ex, ex.__traceback__)

例子:

import traceback

try:
    1/0
except Exception as ex:
    traceback.print_exception(type(ex), ex, ex.__traceback__)

# output:
# Traceback (most recent call last):
#   File "untitled.py", line 4, in <module>
#     1/0
# ZeroDivisionError: division by zero

1
这有点不方便,为什么?在我看来还好啊。 - Jean-François Fabre
8
@Jean-FrançoisFabre,实际上并没有必要向该函数传递 3 个参数。如果存在一个名为 print_exception(ex) 的函数,那会更好。 - Aran-Fey
1
另一个有用的函数是 print_exc(),它可以从 sys.info 获取有关异常的信息。 - Alex Pshenko
参见traceback.format_exc() - matanster
在我看来,exception.traceback() 是一种更干净的面向对象编程语法。 - Nishant
在许多情况下,traceback无法正常工作。例如,如果从共享库调用Python代码。@Jean-FrançoisFabre的回答是正确的。 - user36313

4

您可以手动迭代__traceback__属性以打印行和文件:

def function():
    raise ValueError("flfkl")

try:
    function()
except Exception as e:
    traceback = e.__traceback__
    while traceback:
        print("{}: {}".format(traceback.tb_frame.f_code.co_filename,traceback.tb_lineno))
        traceback = traceback.tb_next

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接