打印python堆栈跟踪,无异常被引发

时间:2010-10-13 15:20:48

标签: python debugging stack-trace

我班级的一个实例变量正在发生一些事情。我想让变量成为一个属性,无论何时访问它,我都要打印出导致该点的所有代码的堆栈跟踪,这样我就可以看到它被搞砸了。如果没有引发异常,如何打印堆栈跟踪?我知道如果有例外,我可以做traceback.format_tb(sys.exc_info()[2])

之类的事情

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

2 个答案:

答案 0 :(得分:76)

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获取打印就绪的堆栈跟踪({{1 }})

答案 1 :(得分:3)

如果您需要将字符串传递给记录器,而不是打印到stdout,您可以使用:

''.join(traceback.format_stack())

注意,traceback.format_stack()将stacktrace作为格式化的字符串列表返回,因此您可以随意切片。要获得堆栈跟踪的最后几个元素,您可以这样做:

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

其中N是您感兴趣的关卡数量。