Python - 使用者定義的例外

你好,未來的Python巫師們!今天,我們將進入Python中的使用者定義例外的奇妙世界。如果你是編程新手,不用擔心;我會一步步引導你完成這次冒險,就像我這些年教學中以數不清的學生一樣。所以,拿起你的虛擬魔杖(鍵盤),我們一起深入探險吧!

Python - User-defined Exception

Python中的使用者定義例外

在我們開始創建自己的例外之前,先快速回顧一下例外是什麼。想像你正在烹飪一道美味的佳肴,但突然發現你少了關鍵的食材。這就像編程中的例外——它是一個意外的情況,會中斷你程式的正常流程。

Python帶有很多內置例外,如ValueErrorTypeErrorZeroDivisionError。但有時,我們需要創建自己的特殊例外來處理我們程式中的獨特情況。這時,使用者定義的例外就派上用場了!

如何創建使用者定義的例外

創建自己的例外就像烤蛋糕一樣簡單(嗯,至少是簡單的蛋糕食譜)。你需要做的就是創建一個從內置Exception類或其任何子類繼承的新類。讓我們看一個簡單的例子:

class MySpecialError(Exception):
pass

就這樣!你剛剛創建了你的第一個使用者定義的例外。我們使用pass語句是因為我們不需要為我們的例外類添加任何額外的功能。

但如果我們想要我們的例外更具說明性呢?讓我們再創建一個:

class ValueTooLargeError(Exception):
def __init__(self, message, value):
self.message = message
self.value = value

在這個例子中,我們為我們的例外類添加了一個__init__方法。這允許我們在引發例外時傳遞額外的信息。

引發使用者定義的例外

現在我們有了自己的自定義例外,讓我們看看如何在程式中使用它們。引發一個例外就像在出現問題時拉響警報一樣。以下是如何做到這一點:

def check_value(value):
max_value = 100
if value > max_value:
raise ValueTooLargeError("Value is too large!", value)
print(f"Value {value} is acceptable.")

# 來試一試
try:
check_value(150)
except ValueTooLargeError as error:
print(f"糟糕!{error.message} The value was {error.value}")

在這個例子中,我們正在檢查一個值是否太大。如果是,我們引發我們的ValueTooLargeError並帶有一個自定義消息和實際的值。

處理使用者定義的例外

處理使用者定義的例外就像處理內置例外一樣。我們使用可靠的try-except塊。讓我們擴展我們之前的例子:

def process_value(value):
try:
check_value(value)
except ValueTooLargeError as error:
print(f"Error: {error.message} The value {error.value} is not allowed.")
# 在這裡你可以添加代碼來處理錯誤,例如要求新的值
else:
print("Value processed successfully!")
finally:
print("Value checking complete.")

# 來試試不同的值
process_value(50)
process_value(200)

在這段代碼中,我們使用try-except塊來處理我們的ValueTooLargeError。我們還添加了一個else子句,如果沒有引發例外則運行,以及一個finally子句,無論是否發生例外都會運行。

完整示例

現在,讓我們將其全部放入一個更複雜的例子中。想像我們正在創建一個簡單的銀行系統:

class InsufficientFundsError(Exception):
def __init__(self, balance, amount):
self.balance = balance
self.amount = amount
self.message = f"Insufficient funds. Balance: ${balance}, Attempted withdrawal: ${amount}"

class NegativeAmountError(Exception):
def __init__(self, amount):
self.amount = amount
self.message = f"Cannot process negative amount: ${amount}"

class BankAccount:
def __init__(self, balance=0):
self.balance = balance

def deposit(self, amount):
if amount < 0:
raise NegativeAmountError(amount)
self.balance += amount
print(f"Deposited ${amount}. New balance: ${self.balance}")

def withdraw(self, amount):
if amount < 0:
raise NegativeAmountError(amount)
if amount > self.balance:
raise InsufficientFundsError(self.balance, amount)
self.balance -= amount
print(f"Withdrew ${amount}. New balance: ${self.balance}")

# 來使用我們的BankAccount類
account = BankAccount(100)

try:
account.deposit(50)
account.withdraw(30)
account.withdraw(200)  # 這應該引發一個InsufficientFundsError
except NegativeAmountError as error:
print(f"Error: {error.message}")
except InsufficientFundsError as error:
print(f"Error: {error.message}")
else:
print("All transactions completed successfully.")
finally:
print(f"Final balance: ${account.balance}")

在這個例子中,我們創建了一個BankAccount類,其中包含depositwithdraw方法。我們還定義了兩個自定義例外:InsufficientFundsErrorNegativeAmountError

當我們嘗試提取超出帳戶餘額的金額時,它會引發一個InsufficientFundsError。如果我們嘗試存款或提取負數額,它會引發一個NegativeAmountError

這是一個很好的例子,展示了使用者定義的例外如何使我們的代碼更具可讀性,並幫助我們以清晰有序的方式處理特定的錯誤情況。

結論

恭喜!你剛剛通過學習使用者定義的例外來提升你的Python技能。這些自定義例外就像你個人的錯誤捕獲部隊,準備好在你的代碼中出現意外情況時跳入行動。

記住,掌握使用者定義例外的關鍵是實踐。嘗試為不同的情況創建自己的例外,你將會像專業人士一樣處理錯誤!

以下是本章涵蓋的方法的快速參考表:

方法 描述
class CustomError(Exception): 創建一個新的例外類
raise CustomError() 引發一個自定義例外
try: 開始一個try塊
except CustomError as error: 捕獲特定的自定義例外
else: 如果沒有引發例外則運行
finally: 無論是否發生例外都會運行

編程愉快,願你的例外永遠被捕捉到!

Credits: Image by storyset