今日分享歌曲
歌名:有你的快樂
歌手:王若琳
音量:42%
作為 Python 初學者,在剛學習 Python 程式設計時,經常會看到一些報錯資訊,在前面我們沒有提及,這章節我們會專門介紹。
借助異常處理機制,甚至在程式崩潰前也可以做一些必要的工作,例如将記憶體中的資料寫入檔案、關閉打開的檔案、釋放配置設定的記憶體等。
Python 異常處理機制會涉及 try、except、else、finally 這 4 個關鍵字,同時還提供了可主動使程式引發異常的 raise 語句。
Python文法錯誤
文法錯誤,也就是解析代碼時出現的錯誤。當代碼不符合 Python 文法規則時,Python解釋器在解析時就會報出 SyntaxError 文法錯誤,與此同時還會明确指出最早探測到錯誤的語句。
print "Hello,Moke"
Python3.X中 上面示例中這種文法是錯誤的,所有文法錯誤提示:SyntaxError
Python運作時錯誤
運作時錯誤,即程式在文法上都是正确的,但在運作時發生了錯誤。
a=1/0
print(a)
在 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("繼續執行")
finally
Python 異常處理機制還提供了一個 finally 語句,通常用來為 try 塊中的程式做掃尾清理工作。
注意,和 else 語句不同,finally 隻要求和 try 搭配使用,而至于該結構中是否包含 except 以及 else,對于 finally 不是必須的(else 必須和 try except 搭配使用)。
- finally 語句的功能是:無論 try 塊是否發生異常,最終都要進入 finally 語句,并執行其中的代碼塊。
finally 塊的強大還遠不止此,即便當 try 塊發生異常,且沒有合适和 except 處理異常時,finally 塊中的代碼也會得到執行。
基于 finally 語句的這種特性,在某些情況下,當 try 塊中的程式打開了一些實體資源(檔案、資料庫連接配接等)時,由于這些資源必須手動回收,而回收工作通常就放在 finally 塊中。
總結
勇敢追求夢想,不斷挑戰自我,不輕易放棄,堅持到底,就一定能夠實作自己的理想和目标。