之前在學習python的時候有整理過python異常處理的文章,不夠簡單也不夠完整,是以決定再整理一篇,算做補充。
<a href="http://www.cnblogs.com/fnng/archive/2013/04/28/3048356.html">http://www.cnblogs.com/fnng/archive/2013/04/28/3048356.html</a>
python shell
打開一個不存在的檔案abc.txt 檔案,當系統找不到abc.txt 檔案時,就會抛出給我們一個ioerror類型的錯誤,no such file or directory:abc.txt (沒有abc.txt這樣的檔案或目錄)
try...except...
假如,我們已經知道這種類型的錯誤,那麼就可以通過一個異常撲捉來撲捉這個錯誤。我們可以通過try...except 來接收這個錯誤。打開檔案寫入:
再來運作程式就會看不到任何錯誤,因為我們用except 接收了這個ioerror錯誤。pass 表示實作了相應的實作,但什麼也不做。
假如我不是打開一個檔案,而是輸出一個沒有定義的變量呢?
顯然,在上面的代碼中我并沒有對aa 指派,運作結果:
我們已經用except 接收錯誤了,為什麼錯誤還是還是抛出來了。如果你細心會發現這一次的錯誤類型是nameerror ,而我接收類型是ioerror ,是以要想接收這個print的錯誤,那麼需要修改接收錯誤的類型為nameerror
雖然,我知道print 語句是可能會抛一個nameerror 類型的錯誤,雖然接收了這個類型錯誤,但我不知道具體的錯誤提示資訊是什麼。那麼,我能不能把錯誤資訊列印出來呢?當然可以:
我們在接收錯誤類型的後面定義一個變量msg用于接收具體錯誤資訊, 然後将msg接收的錯誤資訊列印。再來運作程式:
現在隻列印了一行具體錯誤資訊。
異常的抛出機制:
1、如果在運作時發生異常,解釋器會查找相應的處理語句(稱為handler).
2、要是在目前函數裡沒有找到的話,它會将異常傳遞給上層的調用函數,看看那裡能不能處理。
3、如果在最外層(全局“main”)還是沒有找到的話,解釋器就會退出,同時列印出traceback以便讓使用者找到錯誤産生的原因。
注意:雖然大多數錯誤會導緻異常,但一個異常不一定代表錯誤,有時候它們隻是一個警告,有時候它們可能是一個終止信号,比如退出循環等。
try...finally...
try...finally...子句用來表達這樣的情況:
我們不管線捕捉到的是什麼錯誤,無論錯誤是不是發生,這些代碼“必須”運作,比如檔案關閉,釋放鎖,把資料庫連接配接返還給連接配接池等。
建立檔案poem.txt
tryf.py
運作程式(在windows指令提示符或linux終端下運作):
程式讀poem.txt檔案中每一行資料列印,但是我有意在每列印一行之前用time.sleep方法暫停2秒鐘。這樣做的原因是讓程式運作得慢一些。在程式運作的時候,按ctrl-c中斷/取消程式。
我們可以觀察到keyboardinterrupt異常被觸發,程式退出。但是在程式退出之前,finally從句仍然被執行,把檔案關閉。
到目前為止,我們隻讨論了如何捕捉異常,那麼如何抛出異常呢?
raise抛出異常
使用raise來抛出一個異常:
tryr.py
程式要求使用者輸入一個檔案名,如果使用者輸入的檔案名是hello ,那麼抛出一個nameerror的異常,使用者輸入hello 和nameerror異常之間沒有任何必然聯系,我隻是人為的通過raise來這樣定義,我當然也可以定義稱typeerror ,但我定義的異常類型必須是python提供的。
附錄:
常見的python異常類型