Python-(補充)基本Debug—程式寫錯沒關係!簡單小技巧教你找問題
零、前言
新手最容易感到煩躁的,大概就是程式好不容易寫完,啟動後卻跑出一堆紅字錯誤,但又不知道該怎麼辦、從何改起。實務上這在日常的開發中是非常正常的事情,業餘跟專業程式設計師,面對這件事情時,差異其實只是,專業的程式設計師可以比較有效率知道:
- 主要錯誤出現在哪邊
- 錯誤的類型是什麼
- 錯誤發生的情況
一、錯誤訊息判讀
當你在撰寫程式碼並執行時,如果遇到錯誤,Python 會在終端機或 IDE(例如:VS Code、PyCharm 這種稱為「整合開發環境」(IDE))中顯示錯誤訊息 (如下圖)。
我們現在用上面的例子來說明,這些錯誤訊息雖然看起來複雜,但只要稍微了解它的結構,便可以有效地幫助你找出問題所在。以下是一些重要的訊息解析技巧:
錯誤類型 (Error Type)
當程式出現錯誤時,Python 會在訊息的第一行告訴你錯誤的類型。例如,
SyntaxError
表示語法錯誤,NameError
則表示你使用了一個未定義的變數 (如上圖)。了解這些錯誤類型的意義,可以幫助你更快地找到問題。錯誤位置 (Traceback)
Traceback 是錯誤訊息中的一部分,會顯示程式中哪一行出現了錯誤。通常 Traceback 會從下到上顯示錯誤的發生順序,最上面的部分是最早出現錯誤的地方,從上圖可以看到,他顯示錯誤的行數是在第 1 行
print(test)
處。錯誤訊息 (Error Message)
錯誤訊息通常會跟在錯誤類型後面,提供更詳細的資訊。例如,如果你看到
IndexError: list index out of range
,表示你在嘗試存取一個超出清單範圍的索引值。而這邊的錯誤訊息為NameError: name 'test' is not defined
代表我們沒有定義test
這個變數而導致錯誤發生。
我們再來看一個範例,假設你寫了以下的程式碼:
1
2
numbers = [1, 2, 3]
print(numbers[3])
執行後錯誤訊息如下:
- 這裡的
IndexError
表示你在存取清單時出現了錯誤,錯誤訊息list index out of range
則明確告訴你,索引值超出了清單的範圍,因為 numbers 只存 3 個值,最多只能索引到number[2]
(List index 是從 0 開始算)。
當然實務上我們程式碼會有很多行,錯誤訊息不一定可以如例子這麼明顯看出來,但原則都不變,只要掌握好這 3 種查找的內容,基本上就可以幫助讀者更快速縮小範圍,抓到錯誤的源頭,重點是,要有耐心~
二、錯誤種類查找
在了解了錯誤訊息之後,下一步就是了解錯誤的種類及其成因。
以下介紹幾種常見的錯誤類型,並附上解決方法:
SyntaxError(語法錯誤) 這類錯誤通常發生在你輸入的程式碼不符合 Python 的語法規則。例如,漏掉括號或是寫錯了關鍵字。
1 2
if x = 10: # 這行會產生 SyntaxError,因為應該使用 '==' 而非 '=' pass
NameError(名稱錯誤) 這類錯誤表示你在使用一個變數或函式時,Python 找不到這個名稱。
1
print(my_variable) # 如果 my_variable 尚未定義,則會產生 NameError
TypeError(類型錯誤) 當你嘗試將不兼容的類型結合在一起時,就會出現 TypeError。
1
result = 'string' + 5 # 這行會產生 TypeError,因為不能將「字串」和「數字」相加
IndexError(索引錯誤) 如前面的範例所示,這類錯誤發生在我們嘗試存取一個超出範圍的清單或序列的索引時。 解決方法:檢查清單或序列的長度,並確保索引值在範圍內。
更多錯誤類型,可以瀏覽此網站,裡面有更多詳盡的整理:
三、結語
當初次接觸 Python 程式設計時,遇到錯誤在所難免,又或者說,這才是日常。
但重要的是,不要因為錯誤而氣餒,反而應該將它們視為學習的機會,每次錯誤都是一個讓你更深入理解程式語言運作原理的機會。
在撰寫程式的過程中,善用錯誤訊息來幫助自己找出問題,並養成良好的程式除錯習慣。隨著經驗的累積,會越來越能夠快速地辨識並修正錯誤,逐漸成為一個更成熟的程式設計師。記住,程式寫錯是正常的,重要的是如何應對這些錯誤,並從中學習成長。