程序出現錯誤,會自動引發異常,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異常,把異常詳細信息打印出來。
