iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
Software Development

來一場軟體開發學習之旅系列 第 14

Day 14:錯誤處理與自訂例外 ─ 讓程式更穩健

  • 分享至 

  • xImage
  •  

在實際開發中,程式幾乎不可能一路順風,輸入錯誤、網路斷線、檔案不存在⋯這些都是程式需要處理的意外事件。
如果我們不處理,程式就會當掉,但如果設計得好,就能優雅地應對。

  1. 為什麼需要錯誤處理?
    沒處理:程式會直接崩潰
    有處理:程式能給出友善提示或備案行為
    例子:讀取檔案

file = open("data.txt", "r")
content = file.read()
print(content)

如果data.txt不存在,就會報錯:
FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'

  1. try-except 基本用法
    try:
    file = open("data.txt", "r")
    content = file.read()
    print(content)
    except FileNotFoundError:
    print("檔案不存在,請確認檔案名稱。")

當發生錯誤,程式不會當掉,而是轉到 except 區塊。

  1. 捕捉多種例外
    try:
    num = int(input("請輸入一個數字:"))
    result = 10 / num
    print("結果:", result)
    except ValueError:
    print("輸入的不是數字!")
    except ZeroDivisionError:
    print("除數不能是 0!")

程式可以根據不同錯誤類型做不同的處理。

  1. finally區塊
    有時候我們需要無論成功或失敗都要執行的程式碼,例如關閉檔案、釋放資源。

try:
file = open("data.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("檔案不存在")
finally:
print("程式結束,釋放資源。")

  1. 主動拋出例外raise
    有時候程式本身需要主動檢查並丟出錯誤。

def divide(a, b):
if b == 0:
raise ZeroDivisionError("除數不能是 0!")
return a / b

print(divide(10, 2))
print(divide(5, 0)) # 會丟出 ZeroDivisionError

  1. 自訂例外(Custom Exception)
    我們也可以建立自己的例外類別,讓錯誤訊息更有意義。

class NegativeNumberError(Exception):
"""自訂例外:不允許負數"""
pass

def square_root(num):
if num < 0:
raise NegativeNumberError("數字不能是負數!")
return num ** 0.5

try:
print(square_root(9)) # OK
print(square_root(-4)) # 會丟出 NegativeNumberError
except NegativeNumberError as e:
print("錯誤:", e)

  1. 真實案例:ATM 錯誤處理
    class InsufficientBalanceError(Exception):
    """自訂例外:餘額不足"""
    pass

class ATM:
def init(self, balance=0):
self.__balance = balance

def withdraw(self, amount):
    if amount > self.__balance:
        raise InsufficientBalanceError("餘額不足!")
    self.__balance -= amount
    return self.__balance

atm = ATM(500)
try:
print("提領後餘額:", atm.withdraw(200))
print("提領後餘額:", atm.withdraw(400)) # 餘額不足!
except InsufficientBalanceError as e:
print("交易失敗:", e)

這樣的設計比「單純 print 錯誤」更靈活,因為可以讓外部決定怎麼處理錯誤。

學會了錯誤處理(try-except-finally)與自訂例外,程式因此更穩健。
明天,將學習模組與套件(Modules & Packages),進一步整理程式結構,邁向專案化開發!


上一篇
Day 13:封裝與存取控制 ─ 保護你的程式世界
下一篇
Day 15:模組與套件 ─ 讓程式更有組織
系列文
來一場軟體開發學習之旅15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言