如何在Python关闭时调试异常
当我的程序结束时,我在错误输出中看到的信息是:
Exception exceptions.TypeError: "'NoneType' object is not callable" in <function <lambda> at 0x5507d70> ignored
我理解这是因为在垃圾回收的时候产生了异常(可能是del()?)或者是程序中使用的弱引用回调导致的。
有没有什么方法可以找出这些信息是从哪里来的呢?
2 个回答
7
运行你的Python程序时加上-v选项,这样你就能看到在最后阶段的哪个时刻出现了异常。这对我在遇到同样情况时很有帮助,尤其是在使用sqlalchemy的时候...
1
这里的问题并不在于lambda函数:lambda函数确实有调试信息。
a = lambda: 1
print a.func_code.co_filename
print a.func_code.co_firstlineno
(在python3中可以用a.__code__
来查看。)
问题出在异常的格式化上:它没有显示堆栈跟踪,而这些信息通常是在这里显示的。
如果你想尝试改善这个问题,似乎问题出在Python的errors.c文件中的PyErr_WriteUnraisable()函数。我不确定是否还有其他更深层次的问题让这个变得困难,但我怀疑没有。调用PyErr_Fetch()后,堆栈跟踪应该在"tb"中。