1、異常
異常就是非正常狀態,在Python中使用異常物件來表示異常。若程式在編譯或執行過程中發生錯誤,程式的執行過程就會發生改變,丟擲異常物件,程式流進入異常處理。如果異常物件沒有被處理或捕捉,程式就會執行回溯(Traceback)來終止程式。
2、異常型別
通用異常型別表
Exception類:是通用異常基類下列異常類均繼承於Exception類,python解析器會自動將通用異常型別名稱放在內建名稱空間中,所以當使用通用異常型別時,不需要import exceptions模組。
3、異常處理
3.1 觸發異常raise
raise關鍵字:手動丟擲一個通用的異常型別(Exception),類似Java中的throw陳述句。raise關鍵字後跟異常的名稱,異常名稱能夠標識出異常類的物件。執行raise陳述句時,python會建立指定異常類的物件,還能夠指定對異常物件進行初始化的引數,引數也可以為由若干引陣列成的元組。
註意:一旦執行raise陳述句,程式就會被終止。
格式:raise [exceptionType[,argument][,traceback]]
traceback:這個引數用於追蹤異常物件,一般很少使用。
這樣就可以觸發一個異常,並且接收異常資訊。
3.2 傳遞異常
當你捕獲到異常之後又希望再次的觸發異常只需要使用不帶任何引數的raise關鍵字。
異常會在捕獲之後再次觸發同一個異常。
3.3 assert陳述句觸發異常
assert陳述句根據後面的運算式的真假來控製程式流。若為True,則往下執行。若為False,則中斷程式並呼叫預設的異常處理器,同時輸出指定的提示資訊。
例如:
執行結果:
3.4 捕獲異常try..except..else
註意:except子句的數量沒有限制,但使用多個except子句捕獲異常時,如果異常類之間具有繼承關係,則子類應該寫在前面,否則父類將會直接截獲子類異常。放在後面的子類異常也就不會執行。
格式:
4、try的工作原理
執行一個try陳述句時,python解析器會在當前程式流的背景關係中作標記,當出現異常後,程式流能夠根據背景關係的標記回到標記位,從而避免終止程式。
1、如果try陳述句執行時發生異常,程式流跳回標記位,並向下匹配執行第一個與該異常匹配的except子句,異常處理完後,程式流就透過整個try陳述句(除非在處理異常時又引發新的異常)。
2、如果沒有找到與異常匹配的except子句(也可以不指定異常型別或指定同樣異常型別Exception,來捕獲所有異常),異常被遞交到上層的try(若有try巢狀時),甚至會逐層向上提交異常給程式(逐層上升直到能找到匹配的except子句。實在沒有找到時,將結束程式,並列印預設的錯誤資訊)。
3、如果在try子句執行時沒有發生異常,python將執行else陳述句後的陳述句(可選),然後控制流透過整個try陳述句。
執行結果:
巢狀try:
執行結果:
5、捕捉多個異常
方法一:指定一個通用異常,可以捕獲多個不同的包含在Exception類中的異常類。
方法二:在一個except子句後將多個異常作為元組元素列出。
方法三:except子句後不帶任何異常名稱,捕獲所有異常
6、try..finally陳述句
無論try陳述句塊中是否觸發異常,都會執行finally子句中的陳述句塊,因此一般用於關閉檔案或關閉因系統錯誤而無法正常釋放的資源。比如檔案關閉,釋放鎖,把資料庫連線返還給連線池等。
註意:try..finally與try..except 是可以同時使用的。
NOTE:try…finally 的意義在於,就是我們在 try 程式碼塊中執行了 return 陳述句,但是仍然會繼續執行在 finally 中的程式碼塊,所以我們一般用作處理資源的釋放。
7、自定義異常
透過(直接或簡介)繼承Exception類來建立一個自定義異常類,自定義的異常類只能透過raise關鍵字來手動觸發。
執行結果:
with..as觸發異常自動關閉資源
在使用類檔案的流物件時,都需要單獨的呼叫close()來關閉資源。with..as陳述句能夠實現在with陳述句塊執行完後,自動的關閉檔案。如果with陳述句塊中觸發異常,會呼叫預設的異常處理器處理,而且檔案仍然能夠正常關閉。
執行結果:
8、as獲取異常資訊
每個異常都會有一定的描述資訊,可以透過as關鍵字來獲取。但是這種異常資訊並不適合一般使用者閱讀,所以會使用自定義的異常資訊。但是仍然會將原有的異常資訊保留起來,用於後期的異常分析。
執行結果:
異常引數
也可以使用異常引數作為輸出的異常資訊引數,來獲取異常資訊。並且異常引數中包含有異常資訊、錯誤數字、錯誤位置等屬性。
執行結果:
9、traceback追蹤異常
使用traceback追蹤異常的時候,需要import traceback模組。traceback模組可以有效的幫助檢視異常的詳細資訊。
註意:若希望獲取異常的詳細資訊,卻又不會終止程式的執行,可以在except子句中使用
輸出sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file等異常資訊,實際上是以執行緒安全的方式去使用sys.exc_info()函式來獲取相同的資訊。
執行結果:
異常資訊的重定向:如果希望將異常的資訊儲存在一個指定的檔案中,以供後期分析。可以使用下麵的方法:
執行結果:
sys.exc_info()獲取異常資訊
traceback.print_exc()函式實際上是call sys.exc_info()
執行結果:
異常處理用於處理程式錯誤之外,還有許多應用的地方。如關閉資源、平臺相容、模組匯入等。