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

人生苦短,我選Pythonpython

前文傳送門git

小白學 Python(1):開篇github

小白學 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 上,方便你們取用。

示例代碼-Github

示例代碼-Gitee

相關文章
相關標籤/搜索