跳到主要內容
Cypher's Practical Coding
正在啟動 Python 環境(首次約 15 秒)...

錯誤處理與防呆

情境:你正在批次處理 1000 筆訂單,結果第 500 筆格式錯了。如果不做防呆,程式直接崩潰,前面 499 筆的結果全部白費。try/except 讓你「錯一筆不拖累全批」,程式繼續跑完並留下紀錄。

你會學到什麼

  • try/except 隔離壞資料,讓批次作業不中斷
  • 補齊缺欄位或給預設值,避免 KeyError 崩潰
  • 撰寫自訂驗證函數,先檢查後處理

常見錯誤速查表

錯誤類型何時發生快速處理
ValueError轉型失敗,如 "abc" 轉 inttry/except 跳過或記錄
KeyError字典缺欄位,如缺 discounttry/exceptdict.get(key, default)
TypeError型態不符,如需要數字卻給字串先驗證型態,不符就 raise

跳過壞資料:處理 ValueError

當某筆金額無法轉成數字時,跳過並記錄,其他筆照算。

小提醒:只抓住你預期的例外類型(這裡是 ValueError),不要用空的 except: 把所有錯誤都吞掉,否則真正的程式 bug 會靜悄悄消失。

缺欄位也能繼續:處理 KeyError

某筆訂單少了折扣欄位,給預設值 0 就能不中斷繼續算。

小提醒:dict.get("discount", 0) 是更簡短的寫法,效果相同。但 try/except 能在補救流程中加入更多邏輯(例如記 log)。

自訂驗證函數

在進入主流程前,統一驗證欄位格式,壞資料直接丟出自訂錯誤訊息。把驗證集中成函數,方便重用。

小提醒:raise 是「自己丟出錯誤」,讓上層的 try/except 來接。錯誤訊息寫清楚(例如「價格必須是數字」),方便追查第幾筆出錯。

AI 協作:學了這個,跟 AI 怎麼配合?

AI 寫的程式最怕遇到「意料之外」的資料就整個中斷。try/except 就是防呆機制。

你的人類優勢:

  • 你知道實際資料有多髒(空值、格式錯誤、缺欄位)
  • 你能決定錯誤發生時要「跳過」還是「記錄」還是「停止」

可以這樣跟 AI 說:

這段程式處理 1000 筆資料,有些金額欄位是空的會報 ValueError。幫我加 try/except,遇到錯誤就跳過那筆並記錄下來。

練習題

互動示範

DEMO 1可以修改程式碼試玩
DEMO 2可以修改程式碼試玩
DEMO 3可以修改程式碼試玩

挑戰任務

Task 1

將字串列表 ['10','x','5'] 逐一轉成 int,加總可轉換的部分後印出總和

Task 2

嘗試存取 customer['email'],若 KeyError 則印出 'missing'

Task 3

寫一個函數 check_qty(qty),若 qty 不是整數則丟出 TypeError,否則回傳 qty*2;測試 check_qty('3') 並捕捉錯誤後印出 'bad qty'

BackNext Lesson →