在我的真实情况下,finally
子句中出现Segmentation fault
,我无法做任何事情,因为它源自通过ctypes使用的外部库。其实,我不在乎这段错误,因为剧本无论如何都完成了。在finally子句中的Python异常吃掉了以前的异常
但是,最终的段错误会在它之前发生所有异常事件。因此,从iDontExist
开始调试第一个NameError
就成了一件痛苦的事情。它不会发生在任何地方。目前没有办法在segfault之前看到任何引发的异常。
def f1():
try:
while True:
pass
except KeyboardInterrupt:
print iDontExist
if __name__=="__main__":
try:
f1()
finally:
raise Exception("segfault here")
print "finally"
你认为我能做些什么?修复外部库不是一个选项。
段错误不是'Exception';这是一个信号,导致操作系统杀死你的程序,而不是你可以在“except”块中捕获的东西。如果你只是想确保在编写segfault之前缓冲的任何东西,你可以尝试'sys.stdout.flush(); sys.stderr.flush()'在可能出现段错误的行之前。如果您想在segfault之前捕获并记录异常,请在'finally'之前放置一个'except'块以记录它。如果你想要别的东西......你想要什么? – abarnert 2013-02-27 00:47:21
如果我把'sys.stdout.flush(); sys.stderr.flush()'在抛出异常(“segfault here”)之前'仍然不显示'NameError'。 我想要什么:在'finally'子句发生的任何事情之前查看任何异常 – mknaf 2013-02-27 01:00:12
嗯,是的,这是因为'NameError'尚未打印。它作为正常的出口 - 解释器 - 未捕获 - 异常的一部分被打印出来。如果你不以这种方式退出,你需要以其他方式打印它。 (和EOL的示例一样) – abarnert 2013-02-27 01:12:50