如何在 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 元组,因此如果您不想显示源文本,您可以将其丢弃并连接休息。但是您必须完成构建您想要看到的任何输出的工作。