新手常見Python錯誤及異常解決處理方案
寫Python程式碼的小夥伴不可避免地會遇到程式碼執行錯誤和異常,這次就來詳細且不失通俗地總結一下python中的錯誤和異常。
先丟擲兩個問題:
什麼是Python錯誤和異常?
如何處理Python錯誤和異常?
1.語法錯誤可能是初學者最常遇到的,如下面熟悉的畫面:
SyntaxError: invalid syntax語法錯誤又稱解析錯誤,又有老哥會問什麼是解析錯誤?簡單來說是基本語法結構寫錯了,如:多工寫成一行、for迴圈沒加‘:'等。如下:
多工寫成一行
for迴圈沒加‘:'
上面示例可以看到,針對語法錯誤,python解析器會輸出錯誤的那一行,並且在最先找到的錯誤的位置標記了一個箭頭。
熟悉python語法後,可以避免語法錯誤,但是程式碼常會發生異常(Exception)。還是兩個問題:
2.異常是什麼?
異常和語法錯誤有什麼區別呢?
關於異常,舉個例子:
這行程式碼出現異常,因為Print的p應該小寫:
python丟擲異常型別:NameError,即名字錯誤。
其它異常的例子:
可以看到,異常有不同的型別,發生異常後,其型別名稱會被打印出來。上述這些都是python內建的異常,使用者也可以自定義異常,這裡不做贅述。
3、try...except...語句
有python程式設計經驗的人會知道,python裡用try...except...語句來處理異常情況。
先看個異常處理的示例:
看,我們完美地捕捉到了程式中的異常。
結合上面的示例,處理異常的規則是:把執行的語句放在 try 程式碼塊中,將錯誤處理器程式碼放置在 except 程式碼塊中,except會引發ZeroDivisionError異常來提醒Coder,這段程式碼的錯誤是零不能作為被除數。
except後面也可以不新增異常型別,會捕獲所有出現的異常:
我們可以把try...except...原理歸納為幾個要點:
- 首先,執行 try 子句 (try 和 except 關鍵字之間的(多行)語句)
- 如果沒有異常發生,則跳過 except 子句 並完成 try 語句的執行
- 如果在執行try 子句時發生了異常,則跳過該子句中剩下的部分。然後,如果異常的型別和 except 關鍵字後面的異常匹配,則執行 except 子句 ,然後繼續執行 try 語句之後的程式碼
如果發生的異常和 except 子句中指定的異常不匹配,則將其傳遞到外部的 try 語句中;如果沒有找到處理程式,則它是一個未處理異常,執行將停止並顯示如上所示的訊息
4、多個except子句
上面的try...except...語句只處理了一種異常,如果我想多匹配幾個異常型別,怎麼辦呢?
這裡就需要多個except子句來幫忙了,舉個例子:
引發異常ZeroDivisionError
引發異常TypeError
上面我們用了兩個except,匹配ZeroDivisionError和TypeError這兩種異常,第一個程式碼捕捉到了ZeroDivisionError,第二段程式碼捕捉到了TypeError異常,一個都沒有漏。
當然你還可以這樣寫:
也就是用一個except捕捉多個異常,異常型別放到except後面的元組裡。
綜上,對於多個except子句,可以總結為:
一個try語句可能有多個 except 子句,以指定不同異常的處理程式
最多會執行一個處理程式
處理程式只處理相應的 try 子句中發生的異常,而不處理同一try語句內其他處理程式中的異常
一個 except 子句可以將多個異常命名為帶括號的元組
5、try...except Exception as e語句
我們常常會看看這樣的寫法:
try...exceptException as e其中的e代表什麼意思呢?
再舉個例子:
通過示例可以知道,e輸出了異常型別。
也就是說,Exception匹配了所有異常,把異常名稱賦給了e。
當然這裡不一定非得是e,你可以取任何的變數名,只是約定俗稱這樣寫罷了。
6、try...except...finally語句
try...except...finally語句可能並不那麼常見,但它是非常有用的。
如果說,我想用python打開了一個txt檔案,然後讀取,寫入,最後關閉檔案物件。這是一套常規流程,如果我想捕捉程式碼過程中的異常,又要保證無論是否有異常,最後都必須要關閉檔案。這時候就用到finally,看下面例子:
上面程式碼,既捕捉到了異常,最終又關閉了檔案物件。
finaly的作用是,無論except是否捕捉到異常,
finally後面的程式碼都會執行,try獲取了資源,
finally釋放資源,保證了收尾工作。
7、with...語句
with...語句是try-finally語句的簡寫,可以替代try-finally的功能。
表示式open('poem.txt')返回是一個_io.TextIOWrapper 型別的變數賦給f。
在with語句塊中就可以使用這個變數操作檔案。
執行with這個結構之後,f會自動關閉,相當於自帶了一個finally。
8、總結
本文詳細且清晰地講解了Python中錯誤和異常的概念及其處理方式,
通過具體案例展示try...except、try...finally、with...等句式的具體用法,
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。