MST

星途 面试题库

面试题:自定义异常与Python异常体系融合

假设你正在开发一个金融相关的Python库,需要自定义一些异常类型,如InsufficientFundsError(余额不足异常)、InvalidTransactionError(无效交易异常)等。要求这些自定义异常能够与Python的标准异常体系良好融合,并且在捕获和处理时遵循最佳实践。请详细阐述你会如何设计这些自定义异常类,包括继承关系、属性设置、异常信息处理等方面,并给出完整的代码示例。
48.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 继承关系:自定义异常类应继承自Python标准异常类Exception或其子类,这样可以确保与标准异常体系良好融合。对于特定领域的异常,从更具体的标准异常类继承可能更合适,例如ValueError用于表示无效值相关异常,RuntimeError用于表示运行时发生的异常等。对于InsufficientFundsError,继承自RuntimeError较为合适,因为它表示运行时的资金不足情况;InvalidTransactionError可以继承自ValueError,因为它涉及交易相关的无效值。
  2. 属性设置:根据异常的具体需求,可以在异常类中定义特定的属性,以便在捕获异常时获取更多信息。例如,InsufficientFundsError可以包含当前余额属性,InvalidTransactionError可以包含交易相关详细信息属性。
  3. 异常信息处理:在异常类的__init__方法中,可以设置异常信息,以便在捕获异常时打印出有意义的错误信息。

代码示例

class InsufficientFundsError(RuntimeError):
    def __init__(self, balance, required_amount):
        self.balance = balance
        self.required_amount = required_amount
        super().__init__(f"余额不足,当前余额为 {balance},所需金额为 {required_amount}")


class InvalidTransactionError(ValueError):
    def __init__(self, transaction_info):
        self.transaction_info = transaction_info
        super().__init__(f"无效交易:{transaction_info}")


# 示例使用
try:
    balance = 100
    required_amount = 200
    if balance < required_amount:
        raise InsufficientFundsError(balance, required_amount)
    transaction_info = "非法交易类型"
    if transaction_info:
        raise InvalidTransactionError(transaction_info)
except InsufficientFundsError as e:
    print(f"捕获到余额不足异常: {e}")
    print(f"当前余额: {e.balance}, 所需金额: {e.required_amount}")
except InvalidTransactionError as e:
    print(f"捕获到无效交易异常: {e}")
    print(f"交易信息: {e.transaction_info}")