人生苦短,我選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 否則不走裝飾器,例...