2013-02-27 27 views
2

在我的真实情况下,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" 

你认为我能做些什么?修复外部库不是一个选项。

+1

段错误不是'Exception';这是一个信号,导致操作系统杀死你的程序,而不是你可以在“except”块中捕获的东西。如果你只是想确保在编写segfault之前缓冲的任何东西,你可以尝试'sys.stdout.flush(); sys.stderr.flush()'在可能出现段错误的行之前。如果您想在segfault之前捕获并记录异常,请在'finally'之前放置一个'except'块以记录它。如果你想要别的东西......你想要什么? – abarnert 2013-02-27 00:47:21

+0

如果我把'sys.stdout.flush(); sys.stderr.flush()'在抛出异常(“segfault here”)之前'仍然不显示'NameError'。 我想要什么:在'finally'子句发生的任何事情之前查看任何异常 – mknaf 2013-02-27 01:00:12

+0

嗯,是的,这是因为'NameError'尚未打印。它作为正常的出口 - 解释器 - 未捕获 - 异常的一部分被打印出来。如果你不以这种方式退出,你需要以其他方式打印它。 (和EOL的示例一样) – abarnert 2013-02-27 01:12:50

回答

3

您可以尝试之前,你终于捕获异常:

try: 
    f1() 
except NameError as error: # Change as needed 
    print "Error caught:", error # Or simply "raise", in order to raise the error caught 
finally: 
    raise Exception("segfault here") 
    print "finally" 

也就是说,abamert是正确的:分割故障也不例外,所以你可能会寻找别的东西。

+0

比较好的方法是,例如'except as e:',然后代码打印出基于'e'的东西,而不仅仅是注释。 – abarnert 2013-02-27 00:48:24

+0

同时,我仍然没有100%清楚OP的要求,但是如果他只是想在'finally'中的段错误发生之前看到有关'NameError'的东西来杀死他的解释器,这就是完成它的方法。 。 – abarnert 2013-02-27 00:49:22

+0

@abamert:我举了一个明确的例子。 – EOL 2013-02-27 00:50:46