簡介:打造「防彈」程式
歡迎來到 H2 電腦科學(Computing)課程中最實用的一個章節!你有沒有想過,為什麼網站會提示你的密碼太短,或者當你輸入字母而非數字時,程式會突然「崩潰」(crash)?
在本章中,我們將學習如何防止這些問題。我們將探討資料驗證(Data Validation)(確保輸入的資料合理)、程式測試(Program Testing)(在用戶發現 Bug 之前先行找出問題),以及錯誤處理(Error Handling)(確保程式在出錯時能優雅地處理)。掌握這些技能,正是將「業餘編碼員」蛻變為專業程式設計師的關鍵。
1. 驗證(Validation)與核對(Verification):有什麼區別?
人們常混用這兩個詞,但在電腦科學中,它們的意義截然不同。
資料驗證(Data Validation)是指電腦執行的自動檢查,旨在確保輸入的資料合理(sensible)且符合特定規則。它並不保證資料正確無誤,只保證該資料是「被允許輸入的」。
資料核對(Data Verification)是指確保輸入的資料與原始來源完全一致(exactly matches)的檢查。
生活中的類比
想像你正在註冊健身室會籍:
- 驗證:電腦檢查你的「年齡」是否為 12 到 100 之間的數字。如果你輸入「200」,它會拒絕,因為這不合理。
- 核對:職員查閱你的身份證,確保你在屏幕上輸入的名字確實是你的真實姓名。
重點總結
驗證檢查資料是否合理。
核對檢查資料是否正確。
2. 資料驗證技巧
為了防止系統出現「垃圾資料」,我們會使用幾種特定的檢查方式。如果清單看起來很長,別擔心,大多數技巧都非常直觀!
1. 存在性檢查(Presence Check)
確保欄位沒有被留空。
例子:表格中電郵欄位旁邊的「必填」星號。
2. 檢索檢查(Existence Check)
檢查輸入的資料是否已經存在於系統中,或是清單中的有效項目。
例子:當你嘗試註冊用戶名稱時,系統顯示「用戶名稱已被佔用」。
3. 範圍檢查(Range Check)
檢查數字是否落在特定的邊界範圍內。
例子:考試分數必須在 \(0\) 到 \(100\) 之間。
4. 長度檢查(Length Check)
確保輸入內容具有特定的字元數量,或在一定的長度範圍內。
例子:新加坡電話號碼必須剛好是 8 位數字。
5. 類型檢查(Type Check)
確保資料屬於正確的資料類型(例如:整數、字串、浮點數)。
例子:在數量欄位輸入「Five」而非「5」將會導致類型檢查失敗。
6. 格式檢查(Format Check)
檢查資料是否遵循特定的模式或「遮罩」(mask)。
例子:日期必須採用 DD/MM/YYYY 的格式。
7. 檢查碼(Check Digit)
這是一個根據數字中的其他位數計算出的特殊位數(通常是最後一位)。它用於檢測手動輸入時發生的錯誤(例如數字互換)。
例子:身份證號碼(NRIC)或條碼的最後一個字元。
記憶口訣:「P.E.R.F.L.T」
試著記住「PERFect Little Techniques」(完美的技巧):
Presence (存在性), Existence (檢索), Range (範圍), Format (格式), Length (長度), Type (類型)(別忘了還有Check Digit!)。
3. 識別與修正錯誤
即使是最優秀的程式設計師也會犯錯!你需要了解三種主要的錯誤類型:
A. 語法錯誤(Syntax Errors)
這是程式碼中的「文法」錯誤。程式將完全無法執行。
例子:將 prnt("Hello") 寫成 print("Hello"),或者在 if 語句後忘記加上冒號。
B. 執行階段錯誤(Runtime Errors)
程式碼本身寫得正確(沒有語法錯誤),但在程式運行時發生了問題,導致程式崩潰。
例子:除以零或嘗試打開一個不存在的檔案。
C. 邏輯錯誤(Logic Errors)**
程式可以運行且不會崩潰,但給出的結果錯誤。這些錯誤最難發現!
例子:你想計算正方形面積,卻寫成 Area = Side + Side 而非 Area = Side * Side。
快速回顧
- 語法錯誤:無法啟動(程式碼文法錯)。
- 執行階段錯誤:中途崩潰(運行時崩潰)。
- 邏輯錯誤:結果錯誤(大腦當機)。
4. 設計測試案例(Test Cases)
為了確保程式運作正常,你必須使用不同類型的資料進行測試。假設我們正在測試一個接受學生年齡(範圍:13 到 18)的程式。
1. 正常資料(Normal Data)
落在可接受範圍內的資料。
例子:15, 16。
2. 邊界(極端)資料(Boundary Data)
處於範圍邊緣的資料。錯誤通常發生在這裡!
例子:13 和 18。
3. 錯誤資料(Erroneous/Invalid Data)
超出範圍或類型錯誤的資料。程式應拒絕這些資料。
例子:12, 19, "Hello", 或 \( -1 \)。
避免常見錯誤
學生經常忘記測試邊界資料。請務必測試確切的最小值和最大值!對於 1 到 100 的範圍,你的測試案例絕對應包含 1 和 100。
5. 程式追蹤(Program Tracing):扮演電腦
追蹤是跟隨程式執行步驟,觀察變數值如何變化的過程。
追蹤表(用於非遞迴程式)
追蹤表(Trace Table)是一個表格,每一列代表一個變數,每一行代表程式執行的一個步驟。
小貼士:填寫追蹤表時,只需在變數值改變時寫入。如果值保持不變,可以留空或使用引號,以保持表格整潔。
遞迴樹(用於遞迴程式)
對於會自我呼叫的函式,追蹤表可能會變得很亂。這時我們改用遞迴樹(Recursion Tree)。
1. 從最上方的初始呼叫開始。
2. 每次函式呼叫自己時,就畫出分支。
3. 當回傳值「冒泡」回到頂端時,寫下這些值。
如果起初覺得有點難也別擔心!遞迴樹只是函式「旅程」的地圖而已。
6. 錯誤與例外處理(Error and Exception Handling)
有時錯誤是不可避免的(例如用戶在下載過程中拔掉了網路)。我們使用例外處理(Exception Handling),而不是讓程式直接崩潰。
在 Python 中,我們使用 try...except 區塊:
try:
# 可能導致錯誤的程式碼
number = int(input("輸入一個數字: "))
result = 10 / number
except ZeroDivisionError:
# 若用戶輸入 0 時的處理方式
print("你不能除以零!")
except ValueError:
# 若用戶輸入 "hello" 時的處理方式
print("那不是數字!")
重點總結
例外處理能使你的程式變得穩健(robust)。它允許程式告訴用戶哪裡出錯了,並能繼續執行,而不是直接強制退出。
最後鼓勵:你已經完成了資料驗證和程式測試的基礎!請記住,這一章的目標不僅是為了通過考試,更是為了幫助你建立人們真正能信賴的軟體。繼續多練習那些追蹤表吧!