python的異常處理語法和大多數語言相似:
try:
try塊的語句...
except exceptiontype1 as var:#使用as語句獲得本次捕獲到的異常的實例var
except塊語句...
except exceptiontype2 as var:
except塊語句...
except:
except塊語句...
else:
else塊語句...
finally:
finally塊語句...
執行的流程分兩類:
1.try->若有異常發生->except->finally
2.try->若無異常發生->else->finally
其中try塊執行了可能拋出異常的語句,except塊負責處理拋出的異常,處理的嘗試順序與多個except塊的編寫順序一致,當嘗試發現第一個異常類型匹配的except塊時就進入該塊內執行該except塊的語句,最后一個不指定異常類型的except: 塊匹配任何類型的異常(由於所有異常都繼承自Exception類所有except Exception:與不指定異常類型效果一致)。
except塊至少要有一個,可以使用pass語句如
except:
pass
表示“抓到”異常后不進行任何處理。
finally類是可選的塊,如前面的流程所示,無論是否有異常拋出,只要finally塊存在就會被最終執行(該塊中的語句一般用於關閉打開的資源,比如在try塊中打開的磁盤文件)
此外,python中提供另一種簡單的寫法:with...as...方式
如
with open('abc.txt', 'r') as f:
f語句塊....
上面的f就是打開的文件對象,而采用with..as..方式會在執行完f語句塊后自動關閉打開的文件資源,而不用自己寫finally語句塊。
至於背后的機理,實際上面的with...as...語句在進入f語句塊之前調用open對象(注意python中函數也是對象,具有__call__方法的對象都可以當函數用)
的__enter__方法,該方法的返回值賦值給as后面的f,再在執行完f語句塊后調用open對象的__exit__方法,而open對象作為python的內置對象默認的__enter__方法返回文件對象而__exit__方法剛好關閉了打開的文件資源從而使我們用起來感覺像方便版的try ,finally。
了解了上面的內容后,下面定義我們自己的新的異常類(這在實際開發過程中非常有用):
class myerr(Exception): def __init__(self,err): Exception.__init__(self) self.err=err try: raise myerr('myexception') except myerr as var : print(var.err)
定義自己的異常類一般都繼承自Exception類,初始化時同時使用Exception類的__init__方法,此外,可以通過添加一個err屬性用於存放錯誤信息,方便在后續的異常處理中可以根據錯誤信息的不同來進行不同的處理。
引發自己定義的異常的語法是raise exceptiontype(arg...),直接生成該異常類的一個實例(實例化時需要的參數自行提供)並拋出該異常
在捕獲異常時使用except exceptiontype as var的語法獲取異常實例var,從而可以在后續的處理中訪問該異常實例的屬性。
如上面代碼的輸出為:
myexception