如何在 python 中生成类似堆栈跟踪的 java?
How to generate java like stack trace in python?
根据我使用 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 用于打印其堆栈跟踪的格式,或者这种更改是否需要我在程序的根目录创建自定义异常处理程序?
如果您真的想要,可以使用 traceback.extract_tb
方法重新格式化异常回溯。
参考:https://docs.python.org/2/library/traceback.html#traceback.extract_tb
使用 traceback 模块
import traceback
try:
x= 1/0
except Exception as e:
print(e)
traceback.print_exc()
有一种方法可以更改 Python 用于格式化其堆栈跟踪的格式,那就是您改为编写自己的格式化程序。只有一种内置格式。
您可以将自己的函数分配给 sys.excepthook
,它将充当顶级异常处理程序,可以访问即将发生但未被捕获并导致程序退出的异常。在那里你可以使用 traceback 对象来格式化你喜欢的东西。 Triptych 的回答展示了如何使用 traceback
模块获取每个堆栈帧的信息。 extract_tb
returns 文件名、行号、函数和违规行的源文本的 4 元组,因此如果您不想显示源文本,您可以将其丢弃并连接休息。但是您必须完成构建您想要看到的任何输出的工作。
根据我使用 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 用于打印其堆栈跟踪的格式,或者这种更改是否需要我在程序的根目录创建自定义异常处理程序?
如果您真的想要,可以使用 traceback.extract_tb
方法重新格式化异常回溯。
参考:https://docs.python.org/2/library/traceback.html#traceback.extract_tb
使用 traceback 模块
import traceback
try:
x= 1/0
except Exception as e:
print(e)
traceback.print_exc()
有一种方法可以更改 Python 用于格式化其堆栈跟踪的格式,那就是您改为编写自己的格式化程序。只有一种内置格式。
您可以将自己的函数分配给 sys.excepthook
,它将充当顶级异常处理程序,可以访问即将发生但未被捕获并导致程序退出的异常。在那里你可以使用 traceback 对象来格式化你喜欢的东西。 Triptych 的回答展示了如何使用 traceback
模块获取每个堆栈帧的信息。 extract_tb
returns 文件名、行号、函数和违规行的源文本的 4 元组,因此如果您不想显示源文本,您可以将其丢弃并连接休息。但是您必须完成构建您想要看到的任何输出的工作。