2015-05-15 60 views
3

我想捕獲每個程序錯誤,以便我可以在GUI程序中顯示這些錯誤,但是我發現我無法捕獲某些類型的錯誤,如SyntaxError和IndentError。爲什麼SyntaxError不能被用戶代碼捕獲?

例如:

import traceback 

zero = 0 

try: 
    print "start..." 
v = 3/zero # deliberately no indention, SyntaxError cannot be caught 

except: 
    print "Oooooooooooooops" 
    traceback.print_exc() 
    exit(1) 

print "run ok" 

控制檯輸出爲:

File "D:\w\personal\chj\python-try\catch-syntaxerror\catch_syntax_err.py", line 8 
    v = 3/zero # ``SyntaxError: invalid syntax``, cannot be catched by user 
    ^
SyntaxError: invalid syntax 

所以,我知道我沒趕上例外嘍。

我怎樣才能抓住它?

+0

另一個很好的答案在http://stackoverflow.com/questions/1856408/syntaxerror-inconsistency-in-python –

+0

感謝您的指示。然後在這種情況下,「捕捉」它的唯一方法是讓父進程從python程序中捕獲stderr。 –

回答

2

在代碼實際運行之前,會引發SyntaxError。特別是你的錯誤處理程序還沒有被創建執行。 (你會注意到,如果你的代碼中有任何產生輸出的東西,比如打印語句,當語法有問題時,不管它們在代碼中的什麼地方,輸出都不會被生成)。

但是在你描述的用例中,我不明白爲什麼你需要捕獲SyntaxError。在我看來,你會想要捕捉依賴於程序狀態的錯誤。 SyntaxError不會彈出意外。如果你能夠運行你的程序一次,你將不會在以後的調用中出現SyntaxError(除非你改變了代碼)。

相關問題