錯誤處理 · 10 道範例題

Python 例外處理練習題與答案

例外處理不是把錯誤藏起來。它要判斷哪些錯誤可以恢復,哪些應該讓程式停下,以及呼叫方需要知道什麼。這些題目檢查這種判斷。

39 道題在完整題庫中 · 14 道選擇 · 14 道填空 · 11 道輸出

這個主題考什麼

  • 捕獲你預期的具體例外,而不是所有錯誤。
  • 按順序追蹤 try、except、else 和 finally。
  • 拋出清楚的例外,而不是回傳一個誤導性的值。

常見錯誤

  • 使用裸 except,把真正的編程錯誤也吞掉。
  • 把太多程式碼放進 try,包括根本不會按預期失敗的程式碼。
  • 以為 finally 只在發生例外時執行。
範例題

範例題

10

從完整題庫中挑出的 10 道代表題。先自己作答,再展開答案。

  1. 選擇題q0972

    1. 小明不管做奶茶成不成功都要關店門:try-except-finally 中 finally 何時執行?

    1. 只有例外時
    2. 只有無例外時
    3. 無論是否例外都執行
    4. 從不執行
    顯示答案

    答案

    C. 無論是否例外都執行

    解析: finally 在所有退出路徑上都會執行:正常結束、例外被捕獲、例外沒被捕獲,甚至 try 裡 return。清理程式碼就該放這裡。

  2. 選擇題q0980

    2. 小明把 `except Exception` 寫在 `except ValueError` 前面,ValueError 分支會怎樣?

    1. 永遠不會執行
    2. 仍會先執行
    3. 拋 SyntaxError
    4. 執行兩次
    顯示答案

    答案

    A. 永遠不會執行

    解析: 處理器自上而下比對,第一個命中就結束。Exception 能接住包括 ValueError 在內的普通錯誤,後面那個具體分支成了死程式碼。

  3. 選擇題q0985

    3. 🧋 小明發現原料過期主動報錯,raise 後不帶例外型別會怎樣?

    1. 重新拋出目前例外
    2. 拋出RuntimeError
    3. 什麼都不做
    4. 報錯
    顯示答案

    答案

    A. 重新拋出目前例外

    解析: except 裡的裸 raise 會重新拋出正在處理的例外,保留原始 traceback。常見於記完日誌再交給呼叫方。

  4. 選擇題q1000

    4. 把使用者輸入的 `'abc'` 轉成整數失敗,通常會拋出什麼例外?

    1. FileNotFoundError
    2. ValueError
    3. KeyError
    4. TypeError
    顯示答案

    答案

    B. ValueError

    解析: int('abc') 失敗在內容而不是型別,所以是 ValueError。TypeError 是傳了 None 或串列這類東西。

  5. 填空題q0974

    5. 即使寫入失敗也要保證檔案關閉,用哪個關鍵字打開?

    ____ open('orders.txt', 'w') as f:
        f.write('latte')
    顯示答案

    答案

    with

    解析: with 會呼叫檔案的上下文管理器,正常結束和例外時都關閉,相當於 try/finally。as f 綁定打開的檔案物件。

  6. 填空題q0993

    6. try 語句中哪個關鍵字用來捕獲例外?

    顯示答案

    答案

    except

    解析: except 指定要處理的例外型別並引出處理塊。try 只負責標記被監視的程式碼,finally 管收尾不管捕獲。

  7. 填空題q0998

    7. 主動拋出例外,橫線填什麼關鍵字?

    if price < 0:
        ____ ValueError('價格不能為負')
    顯示答案

    答案

    raise

    解析: raise ValueError(...) 用可展示的訊息拒絕非法價格。前面有條件判斷,合法價格會正常通過。

  8. 輸出預測q0973

    8. 例外被接住後 finally 還執行嗎?輸出什麼?

    try:
        print(1 / 0)
    except ZeroDivisionError:
        print("boom")
    finally:
        print("end")
    顯示答案

    答案

    boom
    end

    解析: 1/0 拋 ZeroDivisionError,進入 except 列印 boom;隨後 finally 執行列印 end。例外被處理,所以不會拋出 traceback。

  9. 輸出預測q0987

    9. 計算器捕獲除以零的錯誤。會列印什麼?

    try:
        print(10 / 0)
    except ZeroDivisionError:
        print("safe")
    顯示答案

    答案

    safe

    解析: 10 / 0 在 print 執行前就拋了,try 裡不會輸出;隨後處理器列印 safe。那次 print 根本沒產生輸出。

  10. 輸出預測q1004

    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 嗎?

通常只在邊界處這樣做:記錄、清理,然後重新拋出或轉換錯誤。具體例外應在你能處理它的地方捕獲。

繼續保持練習節奏。

完整題庫會在這個瀏覽器裡記住進度,支援依主題篩選,並包含每日一題和錯題重練。

開啟完整練習