Python 程式設計

第 4 章    除錯

∗ 如何成為一個成功的程式設計師

▸ 程式開發過程:分析問題、設計解決方案、實作、測試

✶ 每一個步驟都會歷經掙扎、壓力、挫折
✶ 成功完成程式那一刻:滿心歡喜,腦部會釋放快樂的化學物質
✶ 策略:讓腦部常常釋放快樂的物質
✶ 作法:從小程式開始練習,累積許多完成程式的喜悅

∗ 完成程式的一大挑戰:除錯 (Debug)

▸ 策略:與其事後除錯,最好一開始就避免出錯

▸ 作法:

✶ 從小處開始:應將大問題分成小問題,從小問題開始解決才容易成功
✶ 經常測試:等到寫了許多程式才開始測試,如果有錯誤會很難釐清問題所在
✶ 累積式加入程式:完成並測試完一部分程式後,下一步就是想辦法再加入一小部份程式,漸漸往目標推進。 只加一小部份程式就要測試,這樣如果有錯,也比較可能是發生在新加入的程式,除錯較容易

(1) 錯誤類別

∗ 除錯和撰寫程式的思考模式不同

▸ 除錯的過程猶如偵探一般,要仔細探索每一個可能出錯的地方

▸ 主要線索:

✶ 仔細檢視錯誤訊息,了解問題的癥結
✶ 列印相關變數資料,看看其值是否如預期

∗ 錯誤類別

▸ 依照發生頻率統計,SyntaxError, TypeError, NameError, ValueError 四種錯誤佔了所有錯誤近 90%:

錯誤訊息比例說明
SyntaxError54.74%語法錯誤
TypeError14.29%型態錯誤 (例如:函式參數數量不對)
NameError11.05%名稱錯誤 (例如:未定義的變數)
ValueError9.78%值錯誤 (例如:應該是數值,卻給了字串)
TokenError2.67%字元錯誤 (例如:括號不對稱或輸入了不允許的字元)
IndentationError0.31%縮排錯誤
AttributeError0.30%屬性錯誤 (例如:物件無此屬性)
ImportError0.18%匯入錯誤 (例如:匯入的套件不存在)
IndexError0.07%索引錯誤 (例如:陣列元素不存在)

(2) 常見錯誤及除錯策略

∗ SyntaxError:程式語法錯誤

▸ 錯誤訊息:

SyntaxError: invalid syntax

▸ 除錯策略:

# 仔細檢查語法的錯誤,大多數是漏了標點符號,例如括號、引號、或逗點等
# 可以將發生錯誤訊息註解掉,看看是否還有錯誤,如果還有,可能是上下行的問題

∗ TypeError:變數型態錯誤

▸ 錯誤訊息:

TypeError: ...

▸ 除錯策略:仔細檢查變數型態是否不符合運算所要求的資料型態

∗ NameError:變數名稱錯誤

▸ 錯誤訊息:

NameError: name ... is not defined

▸ 除錯策略:仔細檢查變數是否先設值,之後再使用

∗ ValueError:參數值錯誤

▸ 錯誤訊息:

ValueError: ...

▸ 除錯策略:確認在呼叫函式時,提供正確的參數

∗ 最常用的除錯法

▸ 利用 print() 函式將有問題的變數值列印出來,看看是否符合期待

(3) 使用 Pyzo 所提供之除錯功能

▸ 檢視各個變數值:「工具」 「Workspace」

▸ 設定「斷點」(Breakpoint):點擊需要除錯的程式指令的左方空白處 (行號的右方),出現斷點符號

▸ 執行程式:按下 F5 開始執行,程式執行到斷點會停止,並標示該行

▸ 一步一步執行:點擊 Python shell 上方之 debug 圖示 (除錯到下一行) 可執行下一步,並觀察變數值的變化

▸ 結束除錯:點擊 stopDebug 圖示 (停止除錯)