Python-自定义异常

#coding:utf8
import sys
class MyException(Exception):
    def __init__(self, value):
        Exception.__init__(self)
        self.value = value

    def __str__(self):
        return self.value
def raise_ex(args):
    if args == 'err':
        raise MyException('Invalid name is %s' % args)
    else:
        print('name: %s' % args)
 
if __name__ == '__main__':
    name = input('请输入name:')
    try:
        f = raise_ex(name)
    except Exception as e:
        print('type %s ' % type(e))
        print('sys info: %s' % sys.exc_info()[0])
        print(e)

结果

请输入name:err
type <class '__main__.MyException'> 
sys info: <class '__main__.MyException'>
Invalid name is err

<?php
    $redis = new Redis();


<think>我们已知用户的问题:如何在Python中创建自定义异常类。根据引用内容,我们可以总结如下步骤: 1. 创建一个新的类,继承自`Exception`类或其子类(如`BaseException`)。 2. 通常,我们会定义初始化方法(`__init__`)来接受额外的错误信息,并可以自定义属性(如错误码)。 3. 可选:重写`__str__`方法来自定义异常信息的字符串表示。 下面我们根据引用中的示例来详细说明。 ### 步骤说明 #### 1. 创建自定义异常自定义异常类需要继承自`Exception`类(或其子类)。例如: ```python class MyCustomError(Exception): pass ``` #### 2. 初始化方法 在自定义异常类中,我们可以定义`__init__`方法来接受更多的参数,比如错误消息和错误码。 ```python class MyCustomError(Exception): def __init__(self, message, code=None): super().__init__(message) # 调用基类的初始化 self.code = code # 自定义属性 ``` #### 3. 自定义字符串表示(可选) 我们可以重写`__str__`或`__repr__`方法来提供更友好的错误信息。 ```python def __str__(self): return f"{self.args[0]} (Error Code: {self.code})" ``` ### 完整示例 结合引用[2]和引用[4]的示例,我们可以写出以下代码: ```python # 自定义异常类 class CustomError(Exception): """自定义异常类""" def __init__(self, message, code=None): super().__init__(message) # 初始化基类 self.code = code # 自定义的错误码 def __str__(self): # 返回自定义异常信息字符串 return f"错误信息: {self.args[0]}, 错误码: {self.code}" # 使用自定义异常的函数 def divide(a, b): if b == 0: raise CustomError("除数不能为零", code=1001) return a / b # 测试 try: result = divide(10, 0) except CustomError as e: print(e) # 输出:错误信息: 除数不能为零, 错误码: 1001 ``` ### 解释 - 我们定义了一个`CustomError`类,继承自`Exception`。 - 在初始化方法中,我们接受`message`和可选的`code`参数,并将`code`保存为实例属性。 - 重写`__str__`方法,以便在打印异常时显示自定义信息。 - 在函数`divide`中,当除数为零时,我们抛出`CustomError`异常,并传递错误信息和错误码。 - 在`try...except`块中捕获该异常,并打印异常对象(会调用`__str__`方法)。 ### 注意事项 - 自定义异常通常用于表示特定于应用程序的错误情况。 - 通过自定义异常,我们可以提供更详细的错误信息(如错误码),使错误处理更加清晰。 ### 相关问题 1. 自定义异常类可以继承自内置异常(如`ValueError`)吗? 2. 如何在自定义异常中添加更多属性? 3. 自定义异常的最佳实践有哪些? [^1]: Python异常处理:自定义异常② [^2]: 第二十三讲 python自定义异常 [^3]: Python 中如何自定义异常类? [^4]: Python3中异常处理:用户自定义异常</think>### 如何在 Python 中创建自定义异常类 在 Python 中创建自定义异常类需要遵循以下步骤(基于引用[2][3][4]): #### 1. **创建异常类** 继承自 `Exception` 类或其子类: ```python class MyCustomError(Exception): """自定义异常基类""" ``` #### 2. **添加初始化方法** 通过 `__init__` 接收自定义参数: ```python class ValidationError(Exception): def __init__(self, message, error_code): super().__init__(message) # 调用父类初始化 self.error_code = error_code # 添加自定义属性 ``` #### 3. **重写字符串表示(可选)** 自定义异常输出格式: ```python class PaymentError(Exception): def __init__(self, amount, balance): super().__init__(f"余额不足! 需支付: {amount}, 当前余额: {balance}") self.amount = amount self.balance = balance def __str__(self): return f"[支付异常] {super().__str__()}" ``` #### 4. **完整使用示例** ```python class AgeValidationError(Exception): """年龄验证异常""" def __init__(self, age, min_age=18): message = f"年龄 {age} 无效,需满 {min_age} 岁" super().__init__(message) self.age = age self.min_age = min_age # 使用自定义异常 def register_user(age): if age < 18: raise AgeValidationError(age) print("注册成功") try: register_user(16) except AgeValidationError as e: print(f"捕获到自定义异常: {e}") print(f"用户年龄: {e.age}, 最低要求: {e.min_age}") ``` **输出结果**: ``` 捕获到自定义异常: 年龄 16 无效,需满 18 岁 用户年龄: 16, 最低要求: 18 ``` ### 关键要点 1. **继承关系**:必须继承 `Exception` 或其子类(如 `ValueError`)[^2][^3] 2. **自定义属性**:可在 `__init__` 中添加额外属性(如错误码、时间戳等) 3. **错误信息**:通过 `super().__init__()` 设置基础错误信息 4. **最佳实践**: - 异常名称应以 "Error" 结尾(如 `PaymentError`) - 为特定领域创建异常层次结构 - 提供详细的错误上下文信息[^1][^3] ### 相关问题 1. 自定义异常与内置异常(如 `ValueError`)有什么区别?[^3] 2. 如何在自定义异常中添加额外的处理方法(如日志记录)?[^2] 3. 什么场景下应该使用自定义异常而不是标准异常?[^1][^3] 4. 如何为自定义异常编写单元测试? [^1]: Python异常处理:自定义异常② [^2]: 第二十三讲 python自定义异常 [^3]: Python 中如何自定义异常类? [^4]: Python3中异常处理:用户自定义异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值