天天看點

上手之Python之異常

什麼是異常

當檢測到一個錯誤時,Python解釋器就無法繼續執行了,反而出現了一些錯誤的提示,這就是所謂的“異常”, 也就是我們常說的BUG

上手之Python之異常

bug單詞的誕生 

早期計算機采用大量繼電器工作,馬克二型計算機就是這樣的。 1945年9月9日,下午三點,馬克二型計算機無法正常工作了,技術人員試了很多辦法,最後定位到第70号繼電器出錯。負責人哈珀觀察這個出錯的繼電器,發現一隻飛蛾躺在中間,已經被繼電器打死。她小心地用攝子将蛾子夾出來,用透明膠布帖到“事件記錄本”中,并注明“第一個發現蟲子的執行個體。”自此之後,引發軟體失效的缺陷,便被稱為Bug。

上手之Python之異常

異常示範 

例如:以`r`方式打開一個不存在的檔案。

f = open('linux.txt', 'r')      
上手之Python之異常

異常的捕獲方法 

為什麼要捕獲異常

世界上沒有完美的程式,任何程式在運作的過程中,都有可能出現:異常,也就是出現bug 導緻程式無法完美運作下去。

我們要做的,不是力求程式完美運作。 而是在力所能及的範圍内,對可能出現的bug,進行提前準備、提前處理。

這種行為我們稱之為:異常處理(捕獲異常)

當我們的程式遇到了BUG, 那麼接下來有兩種情況:        

① 整個程式因為一個BUG停止運作    

② 對BUG進行提醒, 整個程式繼續運作

顯然在之前的學習中, 我們所有的程式遇到BUG就會出現①的這種情況, 也就是整個程式直接奔潰. 但是在真實工作中, 我們肯定不能因為一個小的BUG就讓整個程式全部奔潰, 也就是我們希望的是達到② 的這種情況 那這裡我們就需要使用到捕獲異常

捕獲異常的作用在于:提前假設某處會出現異常,做好提前準備,當真的出現異常的時候,可以有後續手段。

 捕獲正常異常

基本文法:

try:
    可能發生錯誤的代碼
except:
    如果出現異常執行的代碼      

快速入門

需求:嘗試以`r`模式打開檔案,如果檔案不存在,則以`w`方式打開。

try:
    f = open('linux.txt', 'r')
except:
    f = open('linux.txt', 'w')      

捕獲指定異常 

try:
    print(name)
except NameError as e:
    print('name變量名稱未定義錯誤')      

① 如果嘗試執行的代碼的異常類型和要捕獲的異常類型不一緻,則無法捕獲異常。

② 一般try下方隻放一行嘗試執行的代碼。 

捕獲多個異常 

try:
    print(1/0)
except (NameError, ZeroDivisionError):
    print('ZeroDivision錯誤...')      
上手之Python之異常

捕獲異常并輸出描述資訊 

try:
    print(num)
except (NameError, ZeroDivisionError) as e:
    print(e)      
上手之Python之異常

捕獲所有異常 

try:
    print(name)
except Exception as e:
    print(e)      
上手之Python之異常

異常else 

else表示的是如果沒有異常要執行的代碼。

try:
    print(1)
except Exception as e:
    print(e)
else:
    print('我是else,是沒有異常的時候執行的代碼')      
上手之Python之異常

 異常的finally

finally表示的是無論是否異常都要執行的代碼,例如關閉檔案。

try:
    f = open('test.txt', 'r')
except Exception as e:
    f = open('test.txt', 'w')
else:
    print('沒有異常,真開心')
finally:
    f.close()      

異常的傳遞 

異常是具有傳遞性的

當函數func01中發生異常, 并且沒有捕獲處理這個異常的時候, 異常 會傳遞到函數func02, 當func02也沒有捕獲處理這個異常的時候 main函數會捕獲這個異常,  這就是異常的傳遞性.

提示:     當所有函數都沒有捕獲異常的時候, 程式就會報錯
上手之Python之異常