在不触发异常的情况下打印Python堆栈跟踪

99

我的一个类实例变量出了一些问题。我想把这个变量作为属性,每当它被访问时,我都想打印出导致此时的代码堆栈,以便我可以看到哪里被弄错了。如果没有引发异常,如何打印出堆栈跟踪?我知道如果有异常,可以使用traceback.format_tb(sys.exc_info()[2])之类的东西。

另外,有用的是只打印最后3-4级,因为前面几级可能不是那么有趣。

2个回答

137

traceback.print_stack():

>>> def f():
...   def g():
...     traceback.print_stack()
...   g()
...
>>> f()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in f
  File "<stdin>", line 3, in g

编辑:您还可以使用extract_stack,取一个切片(例如stack[5:]排除前5个级别),并使用format_list获取可打印的堆栈跟踪('\n'.join(traceback.format_list(...))


3
感谢您编辑,它对我回答一个非常通用的full_stack()函数有所帮助!这个回答链接 - Tobias Kienzler

27

如果您需要将内容传递给日志记录器而不是打印到标准输出,请使用以下方法:

Instead of printing to stdout, if you need a string to pass to a logger you can use:


''.join(traceback.format_stack())

请注意,traceback.format_stack() 返回格式化字符串的堆栈跟踪列表,因此您可以按需对其进行切片。要获取堆栈跟踪的最后几个元素,您可以执行以下操作:

''.join(traceback.format_stack()[-N:])

当N为你感兴趣的层数时。


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