Python 捕获任何异常,并打印或记录带变量值的 traceback

7 投票
3 回答
2690 浏览
提问于 2025-04-17 09:23

当我用 sys.excepthook 捕获到意外错误时

import sys
import traceback

def handleException(excType, excValue, trace):
    print 'error'
    traceback.print_exception(excType, excValue, trace)

sys.excepthook = handleException

h = 1
k = 0

print h/k

这是我得到的输出

error
Traceback (most recent call last):
   File "test.py", line 13, in <module>
      print h/k
ZeroDivisionError: integer division or modulo by zero

我该如何在追踪信息中包含变量的值(比如 h、k 等),让它看起来像 这个链接 中的那样?当我加入 cgitb 的时候,结果还是一样。

编辑:

很棒的回答,我只是把它修改成这样,以便将追踪信息记录到一个文件中

def handleException(excType, excValue, trace):
    cgitb.Hook(logdir=os.path.dirname(__file__),
      display=False,
      format='text')(excType, excValue, trace)

3 个回答

0

IPython 有一个内置的选项,可以在错误追踪信息中显示变量的值。

只需要按照下面的方式运行你的脚本:

ipython --InteractiveShell.xmode=Verbose script.py

这样你就能看到完整的错误追踪信息、代码上下文,以及相关变量的值。

1

作为一个最佳实践,你应该避免在输出信息或异常中添加调试信息。其实有一些工具可以帮助你,只需要一行代码就能搞定。下面是一个例子:

这里是图片描述

你可以看看一些相关的包。对于简单的使用,你可以选择 traceback-with-variables(使用 pip install traceback-with-variables 安装),这里是它的介绍:

这里是图片描述

或者你可以试试 tbvaccine,或者 better-exceptions,还有 其他任何包

9

通过查看cgitb.py的源代码,你应该能用类似下面的方式来实现:

import sys
import traceback
import cgitb

def handleException(excType, excValue, trace):
    print 'error'
    cgitb.Hook(format="text")(excType, excValue, trace)

sys.excepthook = handleException

h = 1
k = 0

print h/k

撰写回答