2009-11-11 60 views
35

在Python,如果我打開一個不存在的二進制文件,程序有錯誤,並打印退出:異常消息(Python 2.6中)

Traceback (most recent call last): 
    File "C:\Python_tests\Exception_Handling\src\exception_handling.py", 
    line 4, in <module> 
    pkl_file = open('monitor.dat', 'rb') 
    IOError: [Errno 2] No such file or directory: 'monitor.dat' 

我可以處理這個「嘗試 - 除了」 ,如:

try: 
    pkl_file = open('monitor.dat', 'rb') 
    monitoring_pickle = pickle.load(pkl_file) 
    pkl_file.close() 
except Exception: 
    print 'No such file or directory' 

我怎麼能在抓到Exception時打印下面這行?

File "C:\Python_tests\Exception_Handling\src\exception_handling.py", 
line 11, in <module> 
pkl_file = open('monitor.dat', 'rb') 

所以程序不會退出。

回答

91

這將異常消息:

except Exception, e: 
    print "Couldn't do it: %s" % e 

這將顯示整個回溯:

import traceback 

# ... 

except Exception, e: 
    traceback.print_exc() 

但你可能不希望趕上例外。一般來說,越窄越好,越好。所以你可能想嘗試:

except IOError, e: 

改爲。同樣在縮小你的異常處理,如果你只關心丟失的文件的主題,然後將嘗試 - 除了只在周圍開:

try: 
    pkl_file = open('monitor.dat', 'rb') 
except IOError, e: 
    print 'No such file or directory: %s' % e 

monitoring_pickle = pickle.load(pkl_file) 
pkl_file.close() 
+0

這不適合我。喬亨的回答的確如此。 – Josh

+0

@Josh這個答案和這個答案非常相似。 –

9

的Python有traceback模塊。

import traceback 
try: 
    pkl_file = open('monitor.dat', 'rb') 
    monitoring_pickle = pickle.load(pkl_file) 
    pkl_file.close() 
except IOError: 
    traceback.print_exc() 
6

謝謝大家。

那是,我需要的東西:)

import traceback 

try: 
    # boom 
except Exception: 
    print traceback.format_exc() 
+8

您在發表評論時不應創建答案。接受其中一個答案來獎勵你的幫手! –

+0

請花時間再看看Ned B的回答。除了解決您的緊急問題之外,他還提出了幾個重要的觀點。 – PaulMcG

+0

謝謝,保羅,但我有一種感覺,我們已經在這個問題上達到了活動的結束...... –

22

如果你想捕捉異常傳來的例外對象,這是最好的開始使用,因爲在Python 2.6(目前支持)引入的新格式這將是做成Python 3

的唯一途徑,那就是:

try: 
    ... 
except IOError as e: 
    ... 

例子:

try: 
    pkfile = open('monitor.dat', 'rb') 
except IOError as e: 
    print 'Exception error is: %s' % e 

有關詳細信息,請參見What's New in Python 2.6 documentation

+2

有幫助,但是這並沒有回答這個問題。也許更好的評論? – Josh