我班级的一个实例变量正在发生一些事情。我想让变量成为一个属性,无论何时访问它,我都要打印出导致该点的所有代码的堆栈跟踪,这样我就可以看到它被搞砸了。如果没有引发异常,如何打印堆栈跟踪?我知道如果有例外,我可以做traceback.format_tb(sys.exc_info()[2])
。
另外可能有用的是只打印最后3-4个级别,因为前几个级别可能不会那么有趣。
答案 0 :(得分:76)
>>> 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获取打印就绪的堆栈跟踪({{1 }})
答案 1 :(得分:3)
如果您需要将字符串传递给记录器,而不是打印到stdout,您可以使用:
''.join(traceback.format_stack())
注意,traceback.format_stack()将stacktrace作为格式化的字符串列表返回,因此您可以随意切片。要获得堆栈跟踪的最后几个元素,您可以这样做:
''.join(traceback.format_stack()[-N:])
其中N是您感兴趣的关卡数量。