我的一个类实例变量出了一些问题。我想把这个变量作为属性,每当它被访问时,我都想打印出导致此时的代码堆栈,以便我可以看到哪里被弄错了。如果没有引发异常,如何打印出堆栈跟踪?我知道如果有异常,可以使用traceback.format_tb(sys.exc_info()[2])
之类的东西。
另外,有用的是只打印最后3-4级,因为前面几级可能不是那么有趣。
我的一个类实例变量出了一些问题。我想把这个变量作为属性,每当它被访问时,我都想打印出导致此时的代码堆栈,以便我可以看到哪里被弄错了。如果没有引发异常,如何打印出堆栈跟踪?我知道如果有异常,可以使用traceback.format_tb(sys.exc_info()[2])
之类的东西。
另外,有用的是只打印最后3-4级,因为前面几级可能不是那么有趣。
>>> 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(...))
)
如果您需要将内容传递给日志记录器而不是打印到标准输出,请使用以下方法:
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为你感兴趣的层数时。
full_stack()
函数有所帮助!这个回答链接。 - Tobias Kienzler