程序出現錯誤,會自動引發異常,Python也允許使用raise語句自行引發異常。
一、使用raise引發異常
單獨一個raise引發異常,默認引發RuntimeError異常,例:
try: print ('正在運行try塊...') raise print ('不再運行...') except Exception as e: print ('正在運行except塊...') # 運行結果 正在運行try塊... 正在運行except塊...
raise后帶一個異常類,引發指定異常類的默認實例,例:
def test(): try: print ('正在運行try塊...') raise SyntaxError('引發指定異常...') print ('不再運行...') except TypeError as e: print ('對類型無效的操作...',e) except ValueError as e: print ('傳入無效的參數...',e) except SyntaxError as e: print ('語法錯誤...',e) test() # 運行結果 正在運行try塊... 語法錯誤... 引發指定異常...
二、自定義異常類
Python運行自定義異常類,自定義異常都應該繼承Exception基類或Exception的子類,自定義類大部分情況下都可以采用AuctionException.py類似的代碼來完成,只要改變AuctionException異常的類名即可(使類名更准確的描述該異常)。
自定義一個異常類,例:
class CustomException(Exception): pass def test(): try: raise CustomException except CustomException: print ('觸發異常...') test() # 運行結果 觸發異常...
三、except和raise組合使用
當出現一個異常時,單單靠一個方法無法完全處理該異常,必須使用幾個方法協作才能完全處理該異常時,就用到except塊結合raise語句來完成。
例:
# 自定義異常 class CustomException(Exception): pass class Test: def custom(self): try: aaa except Exception as e: print ('出現異常:',e) raise CustomException('觸發自定義異常~') def test(): T = Test() try: T.custom() except CustomException as e: print ('test函數捕獲異常;',e) test() # 打印 出現異常: name 'aaa' is not defined test函數捕獲異常; 觸發自定義異常~
上面程序中,aaa觸發了NameError異常,執行Test類中的except塊,打印錯誤信息后,通知該方法調用者再次處理CustomException異常,所以custom()方法的調用者test()函數可以再次捕獲CustomException異常,把異常詳細信息打印出來。