天天看點

「萬能Python」-16-錯誤異常

今日分享歌曲

歌名:有你的快樂

歌手:王若琳

音量:42%

作為 Python 初學者,在剛學習 Python 程式設計時,經常會看到一些報錯資訊,在前面我們沒有提及,這章節我們會專門介紹。

借助異常處理機制,甚至在程式崩潰前也可以做一些必要的工作,例如将記憶體中的資料寫入檔案、關閉打開的檔案、釋放配置設定的記憶體等。

Python 異常處理機制會涉及 try、except、else、finally 這 4 個關鍵字,同時還提供了可主動使程式引發異常的 raise 語句。

Python文法錯誤

文法錯誤,也就是解析代碼時出現的錯誤。當代碼不符合 Python 文法規則時,Python解釋器在解析時就會報出 SyntaxError 文法錯誤,與此同時還會明确指出最早探測到錯誤的語句。
print "Hello,Moke"           
「萬能Python」-16-錯誤異常
Python3.X中 上面示例中這種文法是錯誤的,所有文法錯誤提示:SyntaxError

Python運作時錯誤

運作時錯誤,即程式在文法上都是正确的,但在運作時發生了錯誤。
a=1/0
print(a)           
「萬能Python」-16-錯誤異常

在 Python 中,把這種運作時産生錯誤的情況叫做異常(Exceptions)。

當一個程式發生異常時,代表該程式在執行時出現了非正常的情況,無法再執行下去。預設情況下,程式是要終止的。如果要避免程式退出,可以使用捕獲異常的方式擷取這個異常的名稱,再通過其他的邏輯代碼讓程式繼續運作,這種根據異常做出的邏輯處理叫作異常處理。

那麼,應該如何捕獲和處理異常呢?

Python 中,用try except語句塊捕獲并處理異常,其基本文法結構如下所示:
try:
    可能産生異常的代碼塊
except [ (Error1, Error2, ... ) [as e] ]:
    處理異常的代碼塊1
except [ (Error3, Error4, ... ) [as e] ]:
    處理異常的代碼塊2
except  [Exception]:
    處理其它異常           
從try except的基本文法格式可以看出,try 塊有且僅有一個,但 except 代碼塊可以有多個,且每個 except 塊都可以同時處理多種異常。

try except 語句的執行流程如下:

首先執行 try 中的代碼塊,如果執行過程中出現異常,系統會自動生成一個異常類型,并将該異常送出給 Python 解釋器,此過程稱為捕獲異常。

當 Python 解釋器收到異常對象時,會尋找能處理該異常對象的 except 塊,如果找到合适的 except 塊,則把該異常對象交給該 except 塊處理,這個過程被稱為處理異常。如果 Python 解釋器找不到處理異常的 except 塊,則程式運作終止,Python 解釋器也将退出。

def getHTMLText(url):
    headers = {
    'user-agent': random.choice(ua_list1)
    }
    print(headers)
    try:
        r=requests.get(url,headers=headers,timeout=10)
        r.raise_for_status() #如果狀态不是200,引發HTTPerror
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "産生異常"           

上面定義了一個request庫擷取html頁面文本資訊,如果get過程正常則傳回文本資訊,如果異常則傳回“産生異常”提醒。

事實上,不管程式代碼塊是否處于 try 塊中,甚至包括 except 塊中的代碼,隻要執行該代碼塊時出現了異常,系統都會自動生成對應類型的異常。但是,如果此段程式沒有用 try 包裹,又或者沒有為該異常配置處理它的 except 塊,則 Python 解釋器将無法處理,程式就會停止運作;反之,如果程式發生的異常經 try 捕獲并由 except 處理完成,則程式可以繼續執行。

else引入

在原本的try except結構的基礎上,Python 異常處理機制還提供了一個 else 塊,也就是原有 try except 語句的基礎上再添加一個 else 塊,即try except else結構。

使用 else 包裹的代碼,隻有當 try 塊沒有捕獲到任何異常時,才會得到執行;反之,如果 try 塊捕獲到異常,即便調用對應的 except 處理完異常,else 塊中的代碼也不會得到執行。

try:
    result = 20 / int(input('請輸入除數:'))
    print(result)
except ValueError:
    print('必須輸入整數')
except ArithmeticError:
    print('算術錯誤,除數不能為 0')
else:
    print('沒有出現異常')
print("繼續執行")           
「萬能Python」-16-錯誤異常

finally

Python 異常處理機制還提供了一個 finally 語句,通常用來為 try 塊中的程式做掃尾清理工作。

注意,和 else 語句不同,finally 隻要求和 try 搭配使用,而至于該結構中是否包含 except 以及 else,對于 finally 不是必須的(else 必須和 try except 搭配使用)。

  • finally 語句的功能是:無論 try 塊是否發生異常,最終都要進入 finally 語句,并執行其中的代碼塊。
finally 塊的強大還遠不止此,即便當 try 塊發生異常,且沒有合适和 except 處理異常時,finally 塊中的代碼也會得到執行。
「萬能Python」-16-錯誤異常
基于 finally 語句的這種特性,在某些情況下,當 try 塊中的程式打開了一些實體資源(檔案、資料庫連接配接等)時,由于這些資源必須手動回收,而回收工作通常就放在 finally 塊中。

總結

勇敢追求夢想,不斷挑戰自我,不輕易放棄,堅持到底,就一定能夠實作自己的理想和目标。