自定义异常

自定义异常是指程序开发者根据具体需求,定义并使用特定的异常类型。这样可以帮助开发者更好地描述问题,增强程序的可读性和可维护性。


为什么需要自定义异常?

虽然 Python 提供了丰富的内置异常(如 ValueError, IndexError),但在某些业务场景中,内置异常可能不够准确或不适合描述问题。例如:

  • 需要检查银行账户余额是否不足时,可能会引发一个 InsufficientFundsError
  • 在电商应用中,商品库存不足可能引发 OutOfStockError

自定义异常可以让代码的语义更加清晰,方便维护和调试。


如何自定义异常?

自定义异常需要继承 Python 的内置 Exception 类或其子类。

基础语法

class 自定义异常类(Exception):
    def __init__(self, 描述信息):
        self.message = 描述信息
        super().__init__(self.message)

示例:简单的自定义异常

定义异常

class NegativeNumberError(Exception):
    """当输入负数时抛出此异常"""
    def __init__(self, value):
        self.value = value
        self.message = f"错误:不能输入负数 {value}!"
        super().__init__(self.message)

使用异常

def check_positive(number):
    if number < 0:
        raise NegativeNumberError(number)  # 手动抛出异常
    else:
        print(f"输入的是正数:{number}")

try:
    num = int(input("请输入一个正数:"))
    check_positive(num)
except NegativeNumberError as e:
    print(e)  # 输出自定义的错误信息

运行结果

输入 -5
输出

错误:不能输入负数 -5!

示例:带参数的自定义异常

有时候,自定义异常可能需要携带更多信息。

class InsufficientFundsError(Exception):
    """余额不足异常"""
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        self.message = f"余额不足!当前余额:{balance},请求金额:{amount}"
        super().__init__(self.message)

使用异常

def withdraw(balance, amount):
    if amount > balance:
        raise InsufficientFundsError(balance, amount)
    balance -= amount
    print(f"取款成功!剩余余额:{balance}")

try:
    withdraw(100, 200)
except InsufficientFundsError as e:
    print(e)  # 输出详细的错误信息

运行结果

输出

余额不足!当前余额:100,请求金额:200

捕获自定义异常

多异常捕获

自定义异常可以与内置异常一起捕获。

try:
    withdraw(100, 200)
except InsufficientFundsError as e:
    print(e)
except ValueError:
    print("输入无效,请检查数据类型!")

捕获所有异常

try:
    withdraw(100, "abc")
except Exception as e:
    print(f"发生了未知错误:{e}")

自定义异常的最佳实践

  1. 类名语义化:命名应清晰描述问题,例如 FileFormatError, AuthenticationError
  2. 继承 Exception:所有自定义异常应继承自 Exception
  3. 提供详细信息:尽量让错误信息明确,方便调试。
  4. 注释和文档:为自定义异常添加清晰的注释,说明用途和使用场景。

总结

  • 自定义异常是处理特定问题的重要工具。
  • 它让程序逻辑更加清晰,同时便于错误的跟踪和调试。
  • 合理设计和使用自定义异常是编写高质量 Python 程序的一个重要环节。