第48集:自定义异常

学习目标

  • 理解为什么要自定义异常
  • 掌握自定义异常的创建方法
  • 学会抛出自定义异常
  • 掌握自定义异常的应用场景
  • 理解异常的层次结构

一、自定义异常

基本语法

class MyError(Exception):
    """自定义异常类"""
    pass

示例1:简单的自定义异常

class CustomError(Exception):
    """自定义异常"""
    pass

def test_function():
    """测试函数"""
    raise CustomError("这是一个自定义异常")

try:
    test_function()
except CustomError as e:
    print(f"捕获到自定义异常:{e}")

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

class InvalidAgeError(Exception):
    """年龄无效异常"""
    def __init__(self, age, message="年龄无效"):
        self.age = age
        self.message = message
        super().__init__(self.message)

def set_age(age):
    """设置年龄"""
    if age < 0 or age > 150:
        raise InvalidAgeError(age)
    return age

try:
    set_age(200)
except InvalidAgeError as e:
    print(f"错误:{e.message},年龄:{e.age}")

二、异常层次结构

示例3:构建异常体系

class ApplicationException(Exception):
    """应用程序异常基类"""
    pass

class ValidationError(ApplicationException):
    """验证错误"""
    pass

class AuthenticationError(ApplicationException):
    """认证错误"""
    pass

class InvalidUsernameError(ValidationError):
    """无效用户名"""
    pass

class InvalidPasswordError(ValidationError):
    """无效密码"""
    pass

def validate_user(username, password):
    """验证用户"""
    if len(username) < 3:
        raise InvalidUsernameError(username, "用户名太短")
    if len(password) < 6:
        raise InvalidPasswordError(password, "密码太短")
    return True

try:
    validate_user("ab", "12345")
except InvalidUsernameError as e:
    print(f"用户名错误:{e.message}")
except InvalidPasswordError as e:
    print(f"密码错误:{e.message}")
except ValidationError as e:
    print(f"验证错误:{e.message}")

三、实际应用案例

案例:银行账户异常

class BankError(Exception):
    """银行异常基类"""
    pass

class InsufficientFundsError(BankError):
    """余额不足异常"""
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        super().__init__(f"余额不足:余额{balance},需要{amount}")

class NegativeAmountError(BankError):
    """负数金额异常"""
    pass

class BankAccount:
    """银行账户"""
    
    def __init__(self, balance):
        self.balance = balance
    
    def withdraw(self, amount):
        """取款"""
        if amount < 0:
            raise NegativeAmountError("取款金额不能为负数")
        if amount > self.balance:
            raise InsufficientFundsError(self.balance, amount)
        self.balance -= amount
        return self.balance

# 使用示例
account = BankAccount(1000)

try:
    account.withdraw(1500)
except InsufficientFundsError as e:
    print(f"错误:{e}")
except NegativeAmountError as e:
    print(f"错误:{e}")

四、课后练习

练习1

创建一个自定义异常,用于处理无效的输入。

练习2

构建一个异常体系,包含多个相关的异常类。

练习3

实现一个带有自定义参数的异常类。

练习4

在实际应用中使用自定义异常。

练习5

对比使用自定义异常和内置异常的区别。

« 上一篇 finally语句 下一篇 » 调试技巧