2020年6月30日 星期二

錯誤類別簡介

寫程式要不發生錯誤是絕無可能。錯誤分成三大類:語法錯誤,執行時期錯誤(又稱作例外)以及邏輯錯誤。一般的程式開發環境在發生語法錯誤的時候即可偵測出來,並提醒開發者修正。如果沒有修正逕自執行,會返回SyntaxError訊息。至於執行時期錯誤,指的是在執行到一半才會出錯,此時會返回Exception,這一類的錯誤可以用例外處理機制來解決。底下用一個簡單的例子來做說明。

(圖一) for迴圈最後少了冒號

圖一的程式碼是要計算x當中所有數字的總和。在第10行for迴圈的最後少了冒號,這違反了Python的語法規則,因此編輯器在行數10之前顯示了叉叉符號,提醒開發者語法錯誤。如果不修正直接執行,則會出現如圖二的語法錯誤訊息:

(圖二) SyntaxError訊息

在第十行for迴圈之後補上了冒號之後(如圖三),叉叉符號消失,代表沒有語法錯誤。此時再次執行程式,另一個錯誤出現(圖四):

(圖三) 修正語法錯誤之後的程式碼

(圖四) TypeError

這個錯誤是因為x當中混入了字串'John',而字串是無法與數字相加的。由於這是無法預期的錯誤,所以又稱作例外,我們可以用例外處理機制來解決,程式碼修改如下:

(圖五) 加入try-except機制
(圖六) 最後輸出結果

try段指的是如果可以相加便相加,不然便跳到except段去處理。這裡的except直接不處理(pass)。因此迴圈在輪到'John'的時候就什麼都不做,直接輪到下一個值,直到迴圈完成為止。因為例外已經被處理過了(pass也是一種處理),因此不會返回任何錯誤訊息,如圖六。

邏輯錯誤指的是代碼可以完成執行而不會返回錯誤訊息,然而執行結果卻不符合預期。圖七的程式碼目的是求取奇數項的和,即1+3+5+7,總和應為16。然而計算結果卻是12。原因是Python的引數是從0開始,所以程式碼必須改成sum(x[0::2])(如圖八),才能得到預期的結果16。邏輯錯誤一般來說要遠比語法錯誤及執行時期錯誤錯誤難處理的多。

(圖七)

(圖八)



沒有留言:

張貼留言