簡介
不管是在任何的程式語言都會遇到執行時,卻出現錯誤,並出現一大串的錯誤訊息,當然會覺得很煩,但是還是必須解決這些錯誤訊息。有時候是一開始執行就出錯,有時候會是跑到一半出錯,某些錯誤訊息可以判斷是哪個地方錯誤。本篇要分享一下在Python中會遇到的錯誤訊息以及一些防呆機制。
SyntaxError
最常遇見的錯誤就是『SyntaxError』,這可以算是最常遇到的錯誤,通常就是打code打太快,或是貼別人的語法貼的不完整,總括來說就是一般性的語法錯誤。
尤其是你本來是熟悉其他程式語言,突然轉到Python時,有些寫法不同,例如下列程式碼。
C#
if( i >= 10)
{
doSomething
}
Python
if i >= 10:
doSomething
可以知道在Python中的for-loop、if判斷是、def函式等等,後綴都需要有『:』,不像其他大部分程式語言要用『( )』。上圖就是執行後的錯誤訊息,可以看到本段落的錯誤訊息標題。假如你的Debugger給力的話,會指出在哪一行有問題。
NameError & ImportError
這個錯誤訊息通常是你從別人的範例中複製程式碼並貼上後,發現出現該錯誤訊息,可以知道你可能沒有『install package』或是在你的程式碼中沒有『import package』,更低階的錯誤可能是打錯了名稱或是尚未宣告某個變數等等情況。
可以看到上圖,我故意把import的該行程式碼隱藏起來,就出現了『NameError』。
而我故意把Import的類別名稱故意打錯的話,則會出現『ImportError』,代表無法import,會告知你是否打錯類別名稱。
TypeError
依照名稱可以略知一二,代表型態錯誤,通常會發生在初學者還不熟悉Python的資料型態與轉換時會發生。
可以看到上圖,我想要印出11這個字串,但是我在結合字串時,後面的整數轉換數字資料型態錯誤,就印出TypeError的錯誤訊息。
當我修改了轉換整數型態為字串型態『str( )』時,就會正常印出我要的東西了。
ZeroDivisionError & IndexError
這個段落也大概算是資料型態弄錯會遇到的錯誤,先講講ZeroDividionError,這是比較獨特的錯誤,當你在數學運算的除術或其他算數時,假如分母是『 0 』時,就會出現該錯誤來提醒你,無法運算的錯誤。
IndexError算是蠻常會遇到錯誤的,通常使用到list、array等等有關於索引陣列相關的資料型態時,當你索引錯誤時就會出現該錯誤,有可能是超出索引值,或是引入錯誤的索引等等,都會遇到該錯誤。
例外處理 Try-except
在簡介中有提到錯誤的出現與處理,上面幾個段落會出現在剛執行程式時就會出現的錯誤,但另一種情況就是執行程式一段時間時才會發生的事情,那我們要怎樣避免已經跑了一陣子的程式不要半途而廢呢?就是要使用『Try-except』。
#最基礎的Try-except
try:
#嘗試執行的程式碼
except 例外名稱:
#當遇到例外時要執行的程式碼
except 例外名稱:
#當遇到例外時要執行的程式碼
#類似if else
if 變數 判斷 變數:
#執行1
else if 變數 判斷 變數:
#執行2
else:
#執行3
執行的流程會先執行try接著會跑到except,假如不符合例外的話就會一直執行try的程式碼。而except可以不止只有一個。
可以看到上圖Try-except的應用,你可以把except後面放置錯誤訊息,上面的那些錯誤訊息都可以放,例如TypeError、IndexError等等。
進階一點的Try-except-finally
try:
#嘗試執行的程式碼
except 例外名稱:
#當遇到特定的例外時要執行的程式碼
except:
#當未指定的例外發生時要執行的程式碼
else:
#若 try 當中的程式碼並未產生例外時要執行的區塊
finally:
#無論如何都要執行的程式碼
有點驚訝的是在try-except中可以加入else,並且還可以像continue break等的終止指令,如上方敘述程式碼。
我們實際來跑跑看,真的不管try-except執行得如何,到最後一定會跑finally這段程式,大家不仿也試試看。
小結
我分享了許多python的基本概念與套件的介紹,都沒分享過錯誤訊息的整理,當我在使用爬蟲抓取新聞時,常常遇到不定時的程式終止,有時候已經快要爬完了卻終止,真的會非常的X,所以在了解終止的錯誤訊息後,並搭配上try-except例外判斷執行程式碼後,基本上就會順利的、完整的執行玩爬蟲流程了。