人生苦短,我選Pythonpython
前文傳送門git
小白學 Python(1):開篇github
前面咱們已經寫了這麼多示例代碼了,對於報錯信息各位同窗可能都已經司空見慣了,今天咱們就來聊一下報錯信息的處理。
首先,程序在運行的過程當中,產生了異常,這時,咱們可能會有兩種想法,第一種是針對這個異常作某些特殊的處理來進行程序的降級處理;第二種是但願程序忽略這個異常繼續執行下去,這個異常可能並不干擾主邏輯的執行。
那這個時候咱們怎麼辦呢?
有編程經驗的同窗立刻就想到了,那咱們去 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 上,方便你們取用。