从堆栈跟踪中获取更多细节

0 投票
3 回答
591 浏览
提问于 2025-04-16 05:21

有没有什么方便的方法可以让我们在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

撰写回答