2026年11月2日 星期一

Python 例外處理:從飲料店點餐學會 try、except

Python 程式實習|生活情境 × AI 協作

Python 例外處理(Exception Handling):當程式發生錯誤,如何讓它繼續運作?

從飲料店買珍珠奶茶、朋友聚餐分帳,到智慧養殖感測器,逐步理解 try、except、else、finally 與 raise。

一、生活情境:到飲料店買珍珠奶茶

每杯珍珠奶茶 50 元,請顧客輸入購買杯數:

price = 50
quantity = int(input("請問要買幾杯珍珠奶茶?"))
total = price * quantity
print("總金額:", total, "元")

輸入 3,結果是 150 元;但輸入「三杯」會發生 ValueError,因為 int() 無法將這段文字轉成整數。

重點:輸入資料不符合程式預期,不應讓整個點餐流程毫無說明地中斷。

二、第一個例外處理:try 與 except

price = 50
try:
    quantity = int(input("請問要買幾杯珍珠奶茶?"))
    total = price * quantity
    print("總金額:", total, "元")
except ValueError:
    print("輸入錯誤!請輸入數字。")

try 放可能產生例外的程式;except ValueError 負責處理指定的轉換錯誤。其他未被捕捉的例外仍可能中斷程式。

try:執行程式發生 ValueError?否是正常完成 tryexcept:處理錯誤

三、輸入錯誤就重新輸入

加入迴圈,讓顧客可以重新輸入。注意:輸入負數不會自動產生 ValueError,必須另外檢查。

price = 50
while True:
    try:
        quantity = int(input("請問要買幾杯?"))
        if quantity <= 0:
            print("購買數量必須大於 0")
            continue
        break
    except ValueError:
        print("請輸入正確的整數!")

total = price * quantity
print("總金額:", total, "元")
請問要買幾杯?三杯
請輸入正確的整數!
請問要買幾杯?-2
購買數量必須大於 0
請問要買幾杯?3
總金額: 150 元

四、聚餐分帳:認識不同例外

如果 1,200 元餐費要平均分攤,輸入「四個人」會有轉換問題,輸入 0 則會發生除以零的例外。

total = 1200
try:
    people = int(input("請輸入分帳人數:"))
    if people < 0:
        print("人數不能是負數")
    else:
        average = total / people
        print("每人應付:", average)
except ValueError:
    print("請輸入整數!")
except ZeroDivisionError:
    print("分帳人數不能是 0!")
例外典型原因生活情境
ValueError值無法正確轉換杯數輸入「三杯」
ZeroDivisionError除以零分帳人數輸入 0
FileNotFoundError指定檔案不存在找不到成績檔
IndexError索引超出範圍讀取不存在的第 5 筆資料
KeyError字典沒有指定鍵查詢不存在的商品代碼
TypeError運算型別不相容字串與整數直接相加

五、讀取成績檔:FileNotFoundError

try:
    with open("scores.txt", "r", encoding="utf-8") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("找不到成績檔案!")

with open() 能在離開區塊時自動關閉檔案,比手動呼叫 close() 更可靠。

六、try、except、else、finally

try:
    number = int(input("請輸入一個數字:"))
except ValueError:
    print("輸入錯誤!")
else:
    print("輸入成功:", number)
finally:
    print("程式處理結束")
語法作用
try執行可能產生例外的程式
except捕捉並處理指定例外
else當 try 沒有發生例外時執行
finally離開處理結構時通常會執行,適合清理資源

七、raise:自己主動提出例外

當輸入數值雖然是整數,卻不符合商業規則時,可使用 raise。

def order_drink(quantity):
    if quantity <= 0:
        raise ValueError("購買數量必須大於 0")
    return quantity * 50

try:
    total = order_drink(-2)
    print("總金額:", total)
except ValueError as error:
    print("訂購失敗:", error)
訂購失敗: 購買數量必須大於 0

八、整合物件導向:智慧養殖感測資料檢查

延續前面 Class 與封裝的課程,讓養殖池物件檢查溶氧數值。此處使用 None 表示尚未取得有效資料。

class Pond:
    def __init__(self, name):
        self.name = name
        self.oxygen = None

    def update_oxygen(self, value):
        oxygen = float(value)
        if oxygen < 0:
            raise ValueError("溶氧不能小於 0")
        self.oxygen = oxygen

pond1 = Pond("水井一號池")
try:
    pond1.update_oxygen("-5")
except ValueError as error:
    print("感測資料錯誤:", error)
print("目前溶氧:", pond1.oxygen)
感測資料錯誤: 溶氧不能小於 0
目前溶氧: None

這裡的數值與規則只是教學示例。正式 AIoT 系統還需要依感測器規格、現場環境及養殖需求進行驗證。

九、AI 協作實習:No-AI、AI Pair、Challenge AI

No-AI:預測錯誤

先不使用 AI,測試下列程式輸入 ABC、0 與有效整數的結果,並自行加入例外處理。

a = int(input("第一個數字:"))
b = int(input("第二個數字:"))
print(a / b)

AI Pair:請 AI 協助改善

提示詞:「請幫我設計一個 Python 飲料店點餐程式,使用 try、except、else、finally,處理輸入非整數、購買數量小於等於零等情況。請逐步解釋語法,並保持程式簡單。」

Challenge AI:最多輸入錯誤三次

新增需求:顧客最多可以輸入錯誤三次,第三次失敗即取消訂單。先自行設計流程,再與 AI 合作完成。測試第一次成功、錯誤兩次後成功、連續錯誤三次等情況。

十、例外處理不是隱藏錯誤

不要隨意使用沒有指定類型的 except:,更不要用 except: pass 靜默忽略所有問題。應優先捕捉預期的例外,提供清楚訊息;無法安全恢復的錯誤應適當記錄或向上傳遞。

核心觀念:例外處理不是保證程式永遠不出錯,而是讓程式在預期的錯誤發生時,能採取清楚、可控制的應對方式。

十一、結語:從生活中的錯誤,設計更可靠的程式

飲料店點餐、聚餐分帳、成績檔案與智慧養殖感測器,都是理解例外處理的好起點。AI 可以快速寫出 try 與 except,但學生仍需要判斷哪些錯誤可以恢復、哪些應該停止,以及哪些不能被忽略。

下一個實習:Python 例外處理實戰——打造不怕輸入錯誤的飲料店 POS 點餐系統。

沒有留言:

張貼留言