小白學 Python(19) 基礎異常處理

2022-03-17 18:51:32 字數 3976 閱讀 1673

人生苦短,我選python

前文傳送門

小白學 python(1):開篇

小白學 python(2):基礎資料型別(上)

小白學 python(3):基礎資料型別(下)

小白學 python(4):變數基礎操作

小白學 python(5):基礎運算子(上)

小白學 python(6):基礎運算子(下)

小白學 python(7):基礎流程控制(上)

小白學 python(8):基礎流程控制(下)

小白學 python(9):基礎資料結構(列表)(上)

小白學 python(10):基礎資料結構(列表)(下)

小白學 python(11):基礎資料結構(元組)

小白學 python(12):基礎資料結構(字典)(上)

小白學 python(13):基礎資料結構(字典)(下)

小白學 python(14):基礎資料結構(集合)(上)

小白學 python(15):基礎資料結構(集合)(下)

小白學 python(16):基礎資料型別(函式)(上)

小白學 python(17):基礎資料型別(函式)(下)

小白學 python(18):基礎檔案操作

前面我們已經寫了這麼多示例**了,對於報錯資訊各位同學可能都已經司空見慣了,今天我們就來聊一下報錯資訊的處理。

首先,程式在執行的過程中,產生了異常,這時,我們可能會有兩種想法,第一種是針對這個異常做某些特殊的處理來進行程式的降級處理;第二種是希望程式忽略這個異常繼續執行下去,這個異常可能並不干擾主邏輯的執行。

那這個時候我們怎麼辦呢?

有程式設計經驗的同學馬上就想到了,那我們去 try 它啊,在 python 中,我們同樣可以去 try 它,從字面意思上理解就已經非常清晰明確了,以下的內容是要嘗試執行的。

語法:

try:

...(可能產生異常的**)

except:

...(產生異常後的處理**)

但是,還會有一種情況,不管上面的**有沒有出錯,有一部分**我們總希望它能執行,這時,我們可以新增另乙個關鍵字finally

從字面意思可以就可以看出來,這個是最後要執行的意思。

語法:

try:

...(可能產生異常的**)

except:

...(產生異常後的處理**)

finally:

...(一定要執行的**)

下面開始我們今天的**演示。

我們先擬定乙個場景,我們定義乙個除法函式,如果除數不為 0 ,是可以正常返回值的,如果除數為 0 ,那麼整個程式肯定會直接異常報錯。

def division(x, y):

try:

return x / y

except:

print('程式報錯啦!!!')

return none

print(division(15, 5))

輸出結果如下:

3.0
這時程式是可以正常輸出的,這時我們修改一下呼叫的引數,改為division(15, 0),看下輸出結果:

程式報錯啦!!!

none

可以看到,這裡列印了我在程式中設定的none,並沒有之前的紅色的異常資訊丟擲。這裡的except會捕捉我們所有的異常資訊,但是,異常資訊也是有很多分類的,比如我們之前遇到過的訪問字典中不存在的 key 的異常keyerror,比如我們剛才捕捉到的zerodivisionerror異常,還有也是我們之前遇到過的陣列下標越界的異常indexerror

比如這裡的**我可以捕捉更加詳細的異常資訊zerodivisionerror

def division1(x, y):

try:

return x / y

except zerodivisionerror:

print('程式報錯啦!!!')

return none

print(division1(15, 0))

輸出結果如下:

程式報錯啦!!!

none

那麼,看到這裡,你可能會有乙個疑問,我們為什麼要對異常分類,直接抓取所有異常不是更方便麼?

當然,對於邏輯比較簡單的程式,直接捕捉所有異常是更方便的,但是在某些特定的業務場景下,一段程式可能會丟擲多種異常,我們希望根據異常種類的不同,定製不同的解決方案,至少我們知道當前的程式是丟擲了什麼異常,這時,程式異常分類就顯得尤為重要。

我們這裡演示一下,如果我們輸出的值不是數字,是字串的話。。。。

def division2(x, y):

try:

return x / y

except zerodivisionerror:

print('您輸出的除數為 0 !!!')

return none

except typeerror:

print('您輸出的引數型別非法!!!')

return none

print(division2('python', 0))

輸出結果如下:

您輸出的引數型別非法!!!

none

對的,你沒有看錯,異常資訊是能捕捉多個的,是可以併排寫的。至於先丟擲那個,就要看那個異常先發生了。

因為示例**的邏輯過於簡單,異常丟擲順序無法演示,請各位同學見諒(li zhi qi zhuang)。

上面我們還提到了finally,我們接著來演示finally這個關鍵字的使用。

def division3(x, y):

try:

return x / y

except zerodivisionerror:

print('您輸出的除數為 0 !!!')

return none

except typeerror:

print('您輸出的引數型別非法!!!')

return none

finally:

print('你一定能看到我!!!')

print(division3(15, 3))

print(division3('python', 0))

可以看到,這裡我使用有異常和正常無任何問題的資料進行測試,結果如下:

你一定能看到我!!!

5.0您輸出的引數型別非法!!!

你一定能看到我!!!

none

確實,finally中的內容是能正常列印的,這裡多提一句,這裡經常的使用方式是來關閉一些 i/o 讀寫操作或者一些外部連線,如資料庫、快取服務等。

今天的內容就到這裡,各位同學請回去自行嘗試。

示例**-github

示例**-gitee

python 19 異常處理

什麼是異常處理?對於使用者輸入,不想讓使用者看見出錯資訊,對異常進行處理 異常處理的框架是什麼?try 可能出錯的程式1 可能出錯的程式2 程式1出錯了,不在執行程式2 except 錯誤 as e e接收出錯的值,想抓多個錯誤 錯誤1,錯誤2,建議用單獨乙個錯誤,多個錯誤處理原則上是統一處理錯誤。...

python(19)編碼問題

python的編碼問題,一直都讓人很頭疼,今天就整理下python的編碼知識。首先 字串在python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼 decode 成unicode,再從unicode編碼 encode 成另一種編...

python 19 裝飾器高階

假如我們寫了幾百個甚至更多的函式都用同乙個裝飾器,這時需不要使用裝飾器可怎麼辦?乙個乙個取消很現實 但是我們可以寫全域性的引數,讓其生效或不生效。本篇將用帶引數的裝飾器能解決此問題 1 帶引數裝飾器,利用全域性變數,flag true or false true 就走裝飾器 if 否則不走裝飾器,例...