从堆栈跟踪中获取更多细节
有没有什么方便的方法可以让我们在Python出现错误时,获得更详细的错误信息?我希望能找到一个工具或者模块,能够在不修改生成错误的Python脚本的情况下,从错误信息中获取更多的信息。我想在运行单元测试、文档测试,或者从命令行运行一些工具或脚本时使用这个方法。
具体来说,我希望能看到局部变量的值,或者至少是栈中最内层函数的参数值。如果能设置详细程度的选项就更好了。
3 个回答
0
正如pyfunc提到的,你可以使用traceback模块中的一个函数,但这样你只能得到一个堆栈跟踪信息。
如果你想查看堆栈的详细信息,就需要使用sys.exc_info()这个函数,然后遍历traceback
的成员,并从它的帧(tb_frame
)中提取信息。想了解更多这些类型的信息,可以参考Python的参考手册。
下面是一个例子:
def killit(a):
a[10000000000000] = 1
def test(a):
killit(a)
def iterate_traceback(tb):
while tb is not None:
yield tb
tb = tb.tb_next
try:
test(tuple())
except Exception as e:
import sys
exception_info = sys.exc_info()
traceback = exception_info[2]
for tb in iterate_traceback(traceback):
print "-" * 10
print tb.tb_frame.f_code
print tb.tb_frame.f_locals
print tb.tb_frame.f_globals
0
你有没有看过 traceback 模块呢?
在 StackOverflow 上还有:
2
这段内容虽然跟你的问题不完全相关,但你可能会觉得这段代码很有用——它可以在发生严重错误时自动启动Python调试器。这对于处理交互式代码时特别好用。这个代码最初来自于 ActiveState
# code snippet, to be included in 'sitecustomize.py'
import sys
def info(type, value, tb):
if hasattr(sys, 'ps1') or not sys.stderr.isatty():
# we are in interactive mode or we don't have a tty-like
# device, so we call the default hook
sys.__excepthook__(type, value, tb)
else:
import traceback, pdb
# we are NOT in interactive mode, print the exception...
traceback.print_exception(type, value, tb)
print
# ...then start the debugger in post-mortem mode.
pdb.pm()
sys.excepthook = info