【问题标题】:print python stack trace without exception being raised打印python堆栈跟踪,没有异常被引发
【发布时间】:2010-10-13 15:20:47
【问题描述】:
我的班级的一个实例变量发生了一些事情。我想使变量成为一个属性,并且每当访问它时,我都想打印出直到该点的所有代码的堆栈跟踪,这样我就可以看到它在哪里被弄乱了。没有引发异常时如何打印堆栈跟踪?我知道如果有异常我可以做类似traceback.format_tb(sys.exc_info()[2]) 的事情。
另外,可能有用的是只打印最后 3-4 个级别,因为前几个级别可能不会那么有趣。
【问题讨论】:
标签:
python
debugging
stack-trace
【解决方案1】:
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(...)))
【解决方案2】:
如果您需要将字符串传递给记录器,您可以使用,而不是打印到标准输出:
''.join(traceback.format_stack())
注意,traceback.format_stack() 将堆栈跟踪作为格式化的字符串列表返回,因此您可以根据需要对其进行切片。要获取堆栈跟踪的最后几个元素,您可以这样做:
''.join(traceback.format_stack()[-N:])
其中 N 是您感兴趣的级别数。