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}")

在这个例子中,我们创建了一个带有depositwithdraw方法的BankAccount类。我们还定义了两个自定义异常:InsufficientFundsErrorNegativeAmountError

当我们尝试提取账户中超过余额的资金时,它会引发一个InsufficientFundsError。如果我们尝试存入或提取负数金额,它会引发一个NegativeAmountError

这个例子很好地展示了用户定义的异常如何使代码更易读,并帮助我们以清晰和组织的方式处理特定的错误情况。

结论

恭喜你!你刚刚通过学习用户定义的异常提升了你的Python技能。这些自定义异常就像你个人的错误捕捉大军,随时准备在你代码中出现意外情况时采取行动。

记住,掌握用户定义异常的关键是实践。尝试为不同的场景创建自己的异常,很快你就能像专业人士一样处理错误了!

以下是我们在本文中介绍的方法的快速参考表:

方法 描述
class CustomError(Exception): 创建一个新的异常类
raise CustomError() 引发一个自定义异常
try: 开始一个try块
except CustomError as error: 捕获一个特定的自定义异常
else: 如果没有引发异常,则运行
finally: 无论是否发生异常,都始终运行

编程愉快,愿你的异常总是被捕获!

Credits: Image by storyset