第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
对比使用自定义异常和内置异常的区别。