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 負責處理指定的轉換錯誤。其他未被捕捉的例外仍可能中斷程式。
三、輸入錯誤就重新輸入
加入迴圈,讓顧客可以重新輸入。注意:輸入負數不會自動產生 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,但學生仍需要判斷哪些錯誤可以恢復、哪些應該停止,以及哪些不能被忽略。
沒有留言:
張貼留言