如何在Python关闭时调试异常

6 投票
2 回答
1708 浏览
提问于 2025-04-16 00:18

当我的程序结束时,我在错误输出中看到的信息是:

  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"中。

撰写回答