Python - 使用者定義的例外
你好,未來的Python巫師們!今天,我們將進入Python中的使用者定義例外的奇妙世界。如果你是編程新手,不用擔心;我會一步步引導你完成這次冒險,就像我這些年教學中以數不清的學生一樣。所以,拿起你的虛擬魔杖(鍵盤),我們一起深入探險吧!
Python中的使用者定義例外
在我們開始創建自己的例外之前,先快速回顧一下例外是什麼。想像你正在烹飪一道美味的佳肴,但突然發現你少了關鍵的食材。這就像編程中的例外——它是一個意外的情況,會中斷你程式的正常流程。
Python帶有很多內置例外,如ValueError
、TypeError
和ZeroDivisionError
。但有時,我們需要創建自己的特殊例外來處理我們程式中的獨特情況。這時,使用者定義的例外就派上用場了!
如何創建使用者定義的例外
創建自己的例外就像烤蛋糕一樣簡單(嗯,至少是簡單的蛋糕食譜)。你需要做的就是創建一個從內置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
類,其中包含deposit
和withdraw
方法。我們還定義了兩個自定義例外:InsufficientFundsError
和NegativeAmountError
。
當我們嘗試提取超出帳戶餘額的金額時,它會引發一個InsufficientFundsError
。如果我們嘗試存款或提取負數額,它會引發一個NegativeAmountError
。
這是一個很好的例子,展示了使用者定義的例外如何使我們的代碼更具可讀性,並幫助我們以清晰有序的方式處理特定的錯誤情況。
結論
恭喜!你剛剛通過學習使用者定義的例外來提升你的Python技能。這些自定義例外就像你個人的錯誤捕獲部隊,準備好在你的代碼中出現意外情況時跳入行動。
記住,掌握使用者定義例外的關鍵是實踐。嘗試為不同的情況創建自己的例外,你將會像專業人士一樣處理錯誤!
以下是本章涵蓋的方法的快速參考表:
方法 | 描述 |
---|---|
class CustomError(Exception): |
創建一個新的例外類 |
raise CustomError() |
引發一個自定義例外 |
try: |
開始一個try塊 |
except CustomError as error: |
捕獲特定的自定義例外 |
else: |
如果沒有引發例外則運行 |
finally: |
無論是否發生例外都會運行 |
編程愉快,願你的例外永遠被捕捉到!
Credits: Image by storyset