2013-02-27 65 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