python基础(part14)--异常处理
鄙人學習筆記
開發(fā)工具:Spyder
文章目錄
- 異常處理
- 異常
- 異常處理
- 舉個例子1
- 舉個例子2
- raise語句
- 案例
- 自定義異常
- 案例
異常處理
我們先以一個例子為開頭
代碼:
控制臺輸入5,則正常運行:
但如果我們輸入xxx, 那么回怎樣呢:
python會報錯!出現(xiàn)ValueErroe錯誤.
如果我們輸入0,有會怎樣呢:
python又報錯了!出現(xiàn)ZeroDivisionErroe錯誤
備注:如果代碼出現(xiàn)錯誤,那么發(fā)生錯誤之后的代碼,則不會運行(”后續(xù)邏輯…….”沒有被打印)
異常
- 定義
異常就是運行時檢測到的錯誤(在有些語言中,比如JAVA,錯誤和異常是有明確區(qū)別的. 但在python中異常和錯誤的界定不清晰, 我們則可以說錯誤是一種異常)。
- 現(xiàn)象
當運行時,程序不會再向下執(zhí)行,而轉(zhuǎn)到函數(shù)的調(diào)用語句。
比如:
- 常見的異常類型
名稱異常(NameError):變量未定義。
類型異常(TypeError):不同類型數(shù)據(jù)進行運算。
索引異常(IndexError):超出索引范圍。
屬性異常(AttributeError):對象沒有對應(yīng)名稱的屬性。
鍵異常(KeyError):沒有對應(yīng)名稱的鍵。
為實現(xiàn)異常(NotImplementedError):尚未實現(xiàn)的方法。
備注:Exception類為異常基類,是其他所有異常類的父類.
異常處理
為了不讓異常影響到之后的程序運行,我們就需要進行異常的處理,“讓異常變?yōu)檎!薄?/p>
- 語法
- 作用
將程序由異常狀態(tài)轉(zhuǎn)為正常流程。
- 說明
| as子句 | 是用于綁定錯誤對象的變量,可以忽略 |
| except子句 | 該子句可以有一個或多個,用來捕獲某種類型的錯誤 |
| else子句 | 該子句最多只能有一個 |
| finally子句 | 該子句最多只能有一個,如果沒有except子句,該子句就必須存在 |
舉個例子1
代碼:
異常處理:
運行, 并在控制臺輸入ss:
由結(jié)果可知,經(jīng)過異常處理后,我們將發(fā)生的異常打印的出來,并執(zhí)行了后面的代碼。
如果我們修改一下處理語句,如下所示:
運行一下, 并在控制臺先輸入xx, 異常被處理后,再故意輸入ff:
結(jié)果會怎樣呢?
會報錯!這是因為當person_count = int(input(“請輸入人數(shù):”))語句又發(fā)生異常時,它找回了調(diào)用它的語句div_apple(10)(注意:是except下的div_apple(10)),python發(fā)現(xiàn)并沒有 try-except的異常處理語句幫他處理,于是他就報錯了。
Exception類可以捕獲到所有類型的異常。但是如果只寫它,我們就不能對具體錯誤,做出相應(yīng)的處理邏輯。
如果我們再修改一下處理語句,如下所示:
我們試著運行一下, 并在控制臺輸入0:
我們再運行一下, 并在控制臺輸入af:
這樣我們就可以對癥下藥,對具體錯誤,做出相應(yīng)的處理。
但是,我們可能不會預(yù)測到所有會發(fā)生的錯誤。這時,我們就可以,在末尾加一個Exception捕獲剩余錯誤。
我們修改一下處理語句:
這樣就可以既做到對癥下藥,又做到面面俱到。
舉個例子2
我們在處理語句中增加一個else(當沒有發(fā)生異常時,執(zhí)行的語句):
我們再運行一下, 并在控制臺輸入4:
除此之外,還有一個關(guān)鍵字finally(不管有沒有異常都執(zhí)行), 我們測試一下:
我們先在控制臺輸入一個有錯的f:
我們再在控制臺輸入一個沒錯的4:
但是我們要是把print(“無論是否發(fā)生異常, 都執(zhí)行的邏輯”)寫在處理異常的語句之外(詳見下圖),這句話也可以執(zhí)行,那么這個finally到底有啥用呢?
請聽下回分解!
raise語句
- 作用
拋出一個錯誤,讓程序進入異常狀態(tài)。
- 目的
在程序調(diào)用層數(shù)較深時,向主函數(shù)傳遞錯誤信息要層層retrun比較麻煩(或者干脆就不能寫return)。所以,可以人為拋出異常,直接傳遞錯誤信息。
- 圖示
假如我們有一個方法fun01,它調(diào)用了方法fun02, fun02調(diào)用了方法fun03, fun03調(diào)用了方法fun04。當我們想用fun04向fun01傳遞一個信息時,可以層層return,一層一層的傳遞數(shù)據(jù):
但是我們也可以用fun04人為拋出一個異常,直接把信息傳遞給fun01:
案例
我們創(chuàng)建一個Bunny類,如果創(chuàng)建的Bunny對象的age不符合,大于等于0且小于等于5的要求,我們就拋出異常。
代碼:
class Bunny:__slots__ = ("__age")def __init__(self, age):self.age = age@propertydef age(self):return self.__age@age.setterdef age(self, value):if 0 <= value <= 5:self.__age = valueelse:raise ValueError("非幼年")try:b01 = Bunny(6)print(b01.age)except Exception as e:print(e)結(jié)果:
自定義異常
如果python提供的異常類型,并不滿足我們的需求,我們就可以自定義異常。
- 語法
定義自定義異常:
class 類名Error(Exception):def __init__(self,參數(shù)):super().__init__(參數(shù))self.數(shù)據(jù) = 參數(shù)調(diào)用自定義異常:
try:...raise 自定義異常類名(參數(shù))... except 定義異常類 as 變量名:變量名.數(shù)據(jù)- 作用
封裝錯誤信息
案例
我們在上面一個案例中借用了ValueError異常類型,人為拋出異常,但是我們覺得,并不能滿足我們的需求,我們想自己創(chuàng)建一個專用的異常類,拋出錯誤信息。
創(chuàng)建異常類:
class AgeError(Exception):def __init__(self, msg, age_value):super().__init__(msg)self.age_value = age_value備注:msg表示錯誤的信息[這是一定要傳的參數(shù),并且要傳給父類的構(gòu)造方法], 我們還可以自己傳一些想傳遞的信息,比如:age_value錯誤的年齡
調(diào)用自定義異常類:
class Bunny:__slots__ = ("__age")def __init__(self, age):self.age = age@propertydef age(self):return self.__age@age.setterdef age(self, value):if 0 <= value <= 5:self.__age = valueelse:raise AgeError("非幼年", value)創(chuàng)建Bunny類,并處理異常,打印出,異常信息:
try:b01 = Bunny(6)print(b01.age)except AgeError as e:print(e.args)print(e.age_value)結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的python基础(part14)--异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为 A1 无线路由器手机登陆192.1
- 下一篇: python基础(part15)--迭代