自定义异常
自定义异常是指程序开发者根据具体需求,定义并使用特定的异常类型。这样可以帮助开发者更好地描述问题,增强程序的可读性和可维护性。
为什么需要自定义异常?
虽然 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}")
自定义异常的最佳实践
- 类名语义化:命名应清晰描述问题,例如
FileFormatError
,AuthenticationError
。 - 继承
Exception
:所有自定义异常应继承自Exception
。 - 提供详细信息:尽量让错误信息明确,方便调试。
- 注释和文档:为自定义异常添加清晰的注释,说明用途和使用场景。
总结
- 自定义异常是处理特定问题的重要工具。
- 它让程序逻辑更加清晰,同时便于错误的跟踪和调试。
- 合理设计和使用自定义异常是编写高质量 Python 程序的一个重要环节。