一、異常處理的用處何在?
有的時候由於代碼執行錯誤我們可以看見一些錯誤信息,那就是異常,異常並不是錯誤,而是因爲特殊原因,例如 用戶使用錯誤、網絡,通常情況下,異常一旦出現,程序會立刻結束掉,這時我們可以通過這些信息瞭解到語句在哪裏出現錯誤並可以及時處理,這就是異常處理。
哪有有人問了,系統不是都已經告訴我們錯誤信息了嗎?爲啥還有學習?學習怎麼看?
看只是其中的一種,我們還可以學會自己捕抓,並及時做出處理,好像還是說不到點子上。舉個例子吧!比如說電腦藍屏(估計很多人都經歷過),當藍屏時,我們就不可以對的電腦執行除關機衝重啓以外的操作了,那想想這時我們在寫一些很重要的文件或者代碼時,突然藍屏了,那數據不是就丟失了嗎?那有沒有其他的方法改進呢?比如先保存後在藍屏,答案是有的,就是我們可以預測可能發生異常的代碼塊,並進行捕抓,然後進行自己想要的處理。
異常處理的作用:
(1).解決錯誤 except裏面處理
(2).保證代碼的健壯性和穩定性、容錯性
二、異常處理語句
那麼知道這是個啥東西了,那麼我們就得學會使用它。在Python中,異常處理語句是以try...except
語句爲中心擴展開來的。try
語句必須有配套語句。
1.try…excetp語句
在Python中我們使用try
語句進行異常捕抓,並用except
語句進行異常處理。當try
語句內沒有異常時將跳過except
語句,進行其以爲的語句。
格式
try:
…可能出現異常的語句塊
except:
…對異常進行處理
代碼
try:
num = float(input("請輸入數字:"))
print("如果沒有異常將執行此語句")
except:
num = 0
print("如果有異常將執行此語句")
print("不管有沒有異常都執行此語句")
結果顯示
有結果我們可以看出輸入一個漢字時,腳本是應該報錯的,結果沒有報錯,而是執行except
語句裏面的代碼塊。
2.對特定的異常進行異常處理
在很多時候語句的錯誤是多樣化的,可能是文件錯誤,也可以是類型錯誤,中斷錯誤等等。這時我們就可以做出相應的異常處理。當執行到對應異常後,直接跳出except
語句外執行其他語句,except
的特殊語句異常是可以多個匹配的。
那前面不是可以一下子把異常捕抓進行處理嗎?現在一一處理會不會比較麻煩?
是肯定會的,在編寫代碼的時候是複雜的,但是卻可以爲後期的維護省了許多事,比如,知道是文件錯誤,我們就可以單獨對文件進行處理,而不是所有代碼都進行處理。
格式
try:
…可能出現異常的語句塊
except 特殊異常1[as 變量名]:
…對特殊異常1進行對應處理
except (特殊異常2, 特殊異常3):
…對特殊異常2,3進行對應處理
(特殊異常2, 特殊異常3)這個代碼的意思是將對不同特殊異常進行同樣處理。
這裏的[as 變量名]的意思是將異常信息傳遞給一個變量,是用來顯示出現的錯誤信息的,很多情況下我們會將這種錯誤信息存儲在日誌中方便以後的維護。
代碼
try:
num = float(input("請輸入數字:"))
print("如果沒有異常將執行此語句")
except AssertionError:
print("assertion異常")
except ValueError as next_1:
print(next_1)
print("value異常")
except FileNotFoundError:
print("文件異常")
except BaseException: #建議在是所有異常最後添加except BaseException異常處理,對剩餘異常一次做處理
print("最後剩下的未知異常將執行此語句")
print("不管有沒有異常都執行此語句")
結果顯示
異常類的繼承關係:普通異常類繼承了Exception類,Exception類又繼承了BaseException類,BaseException異常處理是對所有異常進行處理。而語法except:
與except BaseException
是差不多的。
3.心細的finally語句
finally
語句是一個非常心細的語句,就是在腳本由於錯誤沒有執行完時,未完成但必須執行的代碼進行強制執行的語句,比如說內存釋放等問題,當文件打開時,由於打開錯誤,沒有及時收回內存,這時我們就可以使用try
語句,強制收回內存。就是說無論try
語句有沒有捕抓到錯誤,都將必須強制執行的語句。
注意:如果使用os._exit()函數的話,就不會執行finally語句內的語句塊
格式
try:
…可能出現異常的語句塊
except 特殊異常1:
…對特殊異常1進行對應處理
except 特殊異常2:
…對特殊異常2進行對應處理
finally:
…強制執行語句塊
代碼
try:
num = float(input("請輸入數字:"))
print("如果沒有異常將執行此語句")
except AssertionError:
print("assertion異常")
except ValueError:
print("value異常")
except FileNotFoundError:
print("文件異常")
except BaseException: #建議在是所有異常最後添加except BaseException異常處理,對剩餘異常一次做處理
print("最後剩下的未知異常將執行此語句")
finally:
print("強制執行此語句")
結果顯示
三、自定義異常
不僅僅有系統提供的異常,也可以由我們來自己定義異常,爲什麼要自己定義呢?假如我們做一個手機號碼記錄器希望用戶輸入的是號碼號碼,而一般情況下號碼都是十一位數字,這時系統是沒有對十一位數字進行拋出異常的,所以就需要我們進行號碼的異常處理了。人爲的拋出異常的目的就是向調用者傳遞信息。
步驟如下
定義一個類
讓這個類繼承Exception或者BaseException
重構初始化方法
並用關鍵字raise捕抓異常
格式
class 自定義異常名字(Exception或者BaseException都行):
…def init(self):
… …對捕抓的異常進行異常處理
raise 捕抓異常
代碼
class LongExceptin(BaseException):
def __init__(self,leng):
self.leng = leng
def __str__(self):
print("\n號碼不對")
num = input("電話號碼:")
if len(num) != 11:
raise LongExceptin(len(num))
else:
print(num)
顯示結果
四、捕獲異常及方法總結
這是一個較全的Python捕獲異常的博文:鏈接在此