根据我使用Java编程的经验,我已经非常喜欢它在我的代码出错时生成的堆栈跟踪,但我觉得python生成的跟踪相比之下有点缺乏。例如,java中的跟踪可能如下所示:
java.lang.RuntimeException
at test.package.Example.c(Example.java:20)
at test.package.Example.b(Example.java:15)
at test.package.Example.a(Example.java:10)
而python跟踪可能如下所示:
Traceback (most recent call last):
File "example.py", line 10, in <module>
a()
File "example.py", line 2, in a
b()
File "example.py", line 5, in b
c()
File "example.py", line 8, in c
raise Exception
Exception
虽然这两个跟踪信息传达的信息基本相同,但我个人发现java中的跟踪更容易理解。
是否有办法更改python用于打印其堆栈跟踪的格式,或者这种更改是否需要我在程序的根目录下创建自定义异常处理程序?
答案 0 :(得分:4)
使用traceback模块
import traceback
try:
x= 1/0
except Exception as e:
print(e)
traceback.print_exc()
答案 1 :(得分:1)
如果您真的想要,可以使用traceback.extract_tb
方法重新格式化异常回溯。
参考:https://docs.python.org/2/library/traceback.html#traceback.extract_tb
答案 2 :(得分:1)
有一种方法可以改变Python用来格式化其堆栈跟踪的格式,那就是你编写自己的格式化程序。只有一种内置格式。
您可以将自己的函数分配给sys.excepthook
,它将充当顶级异常处理程序,可以访问即将上升的异常并导致程序退出。在那里,您可以使用traceback对象来格式化您喜欢的东西。 Triptych的答案显示了如何使用traceback
模块获取每个堆栈帧的信息。 extract_tb
返回有问题的行的文件名,行号,函数和源文本的4元组,因此如果您不想显示源文本,您可以将其丢弃并连接其余部分。但是你必须完成构建你想要看到的任何输出的工作。