Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中生成类似java的堆栈跟踪?_Python_Stack Trace_Traceback - Fatal编程技术网

如何在python中生成类似java的堆栈跟踪?

如何在python中生成类似java的堆栈跟踪?,python,stack-trace,traceback,Python,Stack Trace,Traceback,在我使用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) Tra

在我使用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)
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
而python跟踪可能如下所示:

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)
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
回溯(最近一次呼叫最后一次):
文件“example.py”,第10行,在
()
文件“example.py”,第2行,在
b()
文件“example.py”,b中第5行
c()
文件“example.py”,第8行,c语言
引发异常
例外
虽然这两个跟踪传递的信息基本相同,但我个人发现,来自java的跟踪更容易遵循


是否有方法更改python用于打印堆栈跟踪的格式,或者这种更改是否需要我在程序的根目录下创建一个自定义异常处理程序?

如果确实需要,可以使用
traceback.extract\u tb
方法重新格式化异常跟踪


ref:

如果您确实想,可以使用
traceback.extract\u tb
方法重新格式化异常回溯

参考:

使用模块

使用模块


有一种方法可以改变Python用来格式化堆栈跟踪的格式,那就是编写自己的格式化程序。只有一种内置格式


您可以将自己的函数分配给,它将充当顶级异常处理程序,该处理程序将访问即将出现的异常并导致程序退出。在那里,您可以使用traceback对象来格式化您喜欢的内容。Triptych的回答显示了如何使用
回溯
模块获取每个堆栈帧的信息
extract_tb
返回文件名、行号、函数和有问题行的源文本的4元组,因此如果不想显示源文本,可以将其丢弃并连接其余部分。但是您必须构建您想要看到的任何输出。

有一种方法可以更改Python用于格式化其堆栈跟踪的格式,即您可以编写自己的格式化程序。只有一种内置格式


您可以将自己的函数分配给,它将充当顶级异常处理程序,该处理程序将访问即将出现的异常并导致程序退出。在那里,您可以使用traceback对象来格式化您喜欢的内容。Triptych的回答显示了如何使用
回溯
模块获取每个堆栈帧的信息
extract_tb
返回文件名、行号、函数和有问题行的源文本的4元组,因此如果不想显示源文本,可以将其丢弃并连接其余部分。但是,您必须构建您希望看到的任何输出。

对于Python格式,您特别不喜欢(并且希望更改)哪些内容?在我看来,Python格式比Java格式提供了更多的信息,因为它向您显示了这行代码的实际内容。@BrenBarn我觉得它提供的信息比我需要的更多。当我编写更大的程序时,有时我的堆栈跟踪可能有15个或更多的条目,控制台中的15行额外的内容使我很难准确地找出问题所在(至少对我来说)。我认为有行号就足够了,因为我总是可以打开代码到那一点,自己看看。在我看来,只保留一行没有上下文的代码并不是非常有用的。您特别不喜欢(并且希望更改)Python格式的哪些方面?在我看来,Python格式比Java格式提供了更多的信息,因为它向您显示了这行代码的实际内容。@BrenBarn我觉得它提供的信息比我需要的更多。当我编写更大的程序时,有时我的堆栈跟踪可能有15个或更多的条目,控制台中的15行额外的内容使我很难准确地找出问题所在(至少对我来说)。我认为有行号就足够了,因为我总是可以打开代码到那一点,自己看看。在我看来,一行没有上下文的代码并不是非常有用。