這個主題考什麼
- 捕獲你預期的具體例外,而不是所有錯誤。
- 按順序追蹤 try、except、else 和 finally。
- 拋出清楚的例外,而不是回傳一個誤導性的值。
常見錯誤
- 使用裸 except,把真正的編程錯誤也吞掉。
- 把太多程式碼放進 try,包括根本不會按預期失敗的程式碼。
- 以為 finally 只在發生例外時執行。
範例題
從完整題庫中挑出的 10 道代表題。先自己作答,再展開答案。
-
1. 小明不管做奶茶成不成功都要關店門:try-except-finally 中 finally 何時執行?
顯示答案
答案
C. 無論是否例外都執行解析: finally 在所有退出路徑上都會執行:正常結束、例外被捕獲、例外沒被捕獲,甚至 try 裡 return。清理程式碼就該放這裡。
-
2. 小明把 `except Exception` 寫在 `except ValueError` 前面,ValueError 分支會怎樣?
顯示答案
答案
A. 永遠不會執行解析: 處理器自上而下比對,第一個命中就結束。Exception 能接住包括 ValueError 在內的普通錯誤,後面那個具體分支成了死程式碼。
-
3. 🧋 小明發現原料過期主動報錯,raise 後不帶例外型別會怎樣?
顯示答案
答案
A. 重新拋出目前例外解析: except 裡的裸 raise 會重新拋出正在處理的例外,保留原始 traceback。常見於記完日誌再交給呼叫方。
-
4. 把使用者輸入的 `'abc'` 轉成整數失敗,通常會拋出什麼例外?
顯示答案
答案
B. ValueError解析: int('abc') 失敗在內容而不是型別,所以是 ValueError。TypeError 是傳了 None 或串列這類東西。
-
5. 即使寫入失敗也要保證檔案關閉,用哪個關鍵字打開?
____ open('orders.txt', 'w') as f: f.write('latte')顯示答案
答案
with解析: with 會呼叫檔案的上下文管理器,正常結束和例外時都關閉,相當於 try/finally。as f 綁定打開的檔案物件。
-
6. try 語句中哪個關鍵字用來捕獲例外?
顯示答案
答案
except解析: except 指定要處理的例外型別並引出處理塊。try 只負責標記被監視的程式碼,finally 管收尾不管捕獲。
-
7. 主動拋出例外,橫線填什麼關鍵字?
if price < 0: ____ ValueError('價格不能為負')顯示答案
答案
raise解析: raise ValueError(...) 用可展示的訊息拒絕非法價格。前面有條件判斷,合法價格會正常通過。
-
8. 例外被接住後 finally 還執行嗎?輸出什麼?
try: print(1 / 0) except ZeroDivisionError: print("boom") finally: print("end")顯示答案
答案
boom end
解析: 1/0 拋 ZeroDivisionError,進入 except 列印 boom;隨後 finally 執行列印 end。例外被處理,所以不會拋出 traceback。
-
9. 計算器捕獲除以零的錯誤。會列印什麼?
try: print(10 / 0) except ZeroDivisionError: print("safe")顯示答案
答案
safe解析: 10 / 0 在 print 執行前就拋了,try 裡不會輸出;隨後處理器列印 safe。那次 print 根本沒產生輸出。
-
10. 轉換失敗時使用預設值,輸出什麼?
text = 'abc' try: qty = int(text) except ValueError: qty = 0 print(qty)顯示答案
答案
0解析: int('abc') 拋 ValueError,處理器賦值 qty = 0,列印 0。失敗時 except 一定執行,所以 qty 有定義。
常見問題
else 什麼時候執行?
try 塊沒有例外地完成時,else 會執行。
應該捕獲 Exception 嗎?
通常只在邊界處這樣做:記錄、清理,然後重新拋出或轉換錯誤。具體例外應在你能處理它的地方捕獲。
繼續保持練習節奏。
完整題庫會在這個瀏覽器裡記住進度,支援依主題篩選,並包含每日一題和錯題重練。