Python 捕获任何异常,并打印或记录带变量值的 traceback
当我用 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