python自定义异常

python自定义异常

raise

​ python的异常有两种,一种是python自带的异常,当我们写的代码在语法或其他功能的调用上有误时,如果没有异常捕捉的话代码运行会直接报错的,都算这一类。另一种就是当我们觉得,仅仅只是针对语法方面的报错已经不能满足我们的要求了,我们希望在某些逻辑的环节上,虽然语法没有错,但也要主动报错,以避免按照错误的逻辑继续执行,后面这一种就属于自定义异常,为的就是在我们需要的时候抛出一个异常。

​ 凡是自定义异常就绕不开一个关键词——raise,其作用就是主动抛出异常。raise 语句有如下三种常用的用法:

  1. raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
  2. raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
  3. raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
# 用法一:
>>> raise
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise
RuntimeError: No active exception to reraise
    

# 用法二:
>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError


# 用法三:
>>> raise ZeroDivisionError("除数不能为零")
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    raise ZeroDivisionError("除数不能为零")
ZeroDivisionError: 除数不能为零

​ 实际上用得比较多的是第三种,这样的用法意味着我们可以在原有的异常类型中,将报错信息修改成我们想要的内容;也意味着我们可以自己写一个报错类型,然后根据不同情景抛出不同的报错信息。

下面简单写一个阶乘的函数来展示raise不同的应用方式:

基于基类修改报错信息,直接放在一个逻辑中

def factorial(num):
    try:
        if num < 0 or type(num) != int:
            raise Exception("该数不能阶乘")
    	else:
            return num * factorial(num-1)
    except Exception as e:
        print(e)

就正常的逻辑来讲,当参数小于零或者不是整型时,代码也是可以继续往下执行的,但得到的并不是我们想要的结果,所以要结束掉 然后再给一个反馈。raise语句其中的作用就是引发一个报错,再让外部的异常捕捉机制来处理。

定义一个新的异常类

class NewException(Exception):
    def __init__(self,errorinfo):
        super().__init__(self)
        self.errorinfo = errorinfo
    def __str__(self):
        return self.errorinfo
    
def factorial(num):
    try:
        if num < 0 or type(num) != int:
            raise NewException("我说你错了,你就是错了")
    	else:
            return num * factorial(num-1)
    except Exception as e:
        print(e)

这种方式是常用的,而且上面的这个类NewException是一个通用的模板,你可以把你想要抛出的异常全部归到这里来,然后不同场景添加不同的报错信息就是了。在这里顺便提一下异常的继承关系,Exception是异常处理过程中所有异常的基类。所有的异常捕捉可以直接指定捕捉某一个具体的异常(如:except NameError:),也可以直接笼统地捕捉所有异常(except Exception:),我们定义新的类也是继承自Exception,继承更上级或更下级类也可以,没多大必要。

(图片来自网络:https://www.jianshu.com/p/24e6fb03d6d6)

img

写一个装饰器

这种形式只是我最近刚整理完装饰器的知识,在这里融汇贯通一下,写着玩的。不常用,也不推荐。

def decator(fun):
    def inner(num):
        try:
            if num < 0 or type(num) != int:
            	raise Exception("我说你错了,你就是错了")
            else:
               return fun(num)
        except Exception as e:
            print(e)
    return inner

@decator
def factorial(num):
    return 1 if num == 0 or num == 1 else num * factrial(num-1)

assert断言

​ 断言语句也是一种主动抛出异常的方式,是我个人用得比较多的方式。其原理为,如果断言给出的命题为真则继续往下执行,否则直接抛出异常AssertionError。另外,断言语句也可以自定义报错信息,其写法为:assert 判断语句 [,报错信息]

def factorial(num):
    assert num >=0 and type(num) == int,"该数不能阶乘"
    return 1 if num == 0 or num == 1 else num * factorial(num-1)

ssert num >=0 and type(num) == int,“该数不能阶乘”
return 1 if num == 0 or num == 1 else num * factorial(num-1)


此外,assert断言语句也可以跟raise语句结合使用,大家有兴趣的话也可以找其他帖子了解一下,本文不再赘述
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中,我们可以通过自定义异常来提高代码的可读性和可维护性。自定义异常可以让我们更好地处理特定的异常情况,同时也可以加强程序的健壮性。 下面是一个简单的示例,演示如何自定义异常: ```python # 定义一个自定义异常类 class MyException(Exception): def __init__(self, message): super().__init__(message) self.message = message # 使用自定义异常类 try: raise MyException("发生了自定义异常") except MyException as e: print(e.message) ``` 在上面的示例中,我们定义了一个名为 MyException 的自定义异常类,继承自 Exception 类。在类的构造函数中,我们通过 super() 函数调用父类的构造函数,并将异常消息传递给它。然后,我们使用 raise 语句抛出自定义异常,并在 try-except 块中捕获它。最后,我们打印自定义异常的消息。 当我们运行这个程序时,它会输出以下内容: ``` 发生了自定义异常 ``` 这表明我们成功地定义了一个自定义异常类,并使用它来处理异常情况。 ### 回答2: Python中的自定义异常是指根据特定需求和情况,我们可以自己创建特定的异常类型,而不是仅仅使用内置的异常类型。 在Python中,我们可以通过继承内置的Exception类来创建自己的异常类。使用自定义异常能够帮助我们更好地处理错误和异常情况,并且可以提供更多的信息给开发者。 创建自定义异常的步骤如下: 1. 创建一个新类,继承内置的Exception类。 2. 在新类中添加适当的属性和方法,用于指定异常的详细信息和处理方式。 3. 可选地,可以在自定义异常类中重写__str__方法,以提供更好的错误消息。 4. 使用raise语句抛出自定义异常自定义异常可以提供更具体的错误信息,帮助开发者更方便地定位和解决问题。例如,当我们编写一个处理文件的程序时,如果遇到文件不存在的情况,可以创建一个名为FileNotFoundError的自定义异常。这样,在遇到文件不存在的错误时,我们就可以抛出这个自定义异常,并在处理异常的代码中提供相应的处理逻辑。 总结起来,Python自定义异常是通过继承内置的Exception类,创建一个新的异常类。自定义异常能够提供更多的错误信息,帮助我们处理程序中的特定情况和错误。 ### 回答3: Python中可以通过继承Exception类来自定义异常。这样可以根据自己的需求定义一些特定的异常类型,从而更好地进行错误处理。 自定义异常可以帮助我们更好地区分不同的错误类型,并根据不同的错误类型进行不同的处理。例如,假设我们正在开发一个银行系统,根据用户的输入金额进行转账操作。如果用户输入的金额小于零,我们可以定义一个名为NegativeAmountError的自定义异常,用于表示金额不能为负数的情况。当用户输入的金额小于零时,我们可以抛出这个自定义异常,然后进行相关的错误处理。 定义自定义异常的方法很简单,只需要创建一个继承自Exception的类,并在类中添加自定义的错误信息即可。例如: ```python class NegativeAmountError(Exception): def __init__(self, amount): self.amount = amount def __str__(self): return f"金额不能为负数: {self.amount}" ``` 上述代码中,我们定义了一个名为NegativeAmountError的自定义异常,并在类的构造方法中传入用户输入的金额。在自定义异常类中,我们还重写了父类的__str__方法,以便在抛出异常时能够打印出有用的错误信息。 使用自定义异常也很简单,只需要在需要抛出异常的地方使用raise关键字即可。例如: ```python amount = -100 if amount < 0: raise NegativeAmountError(amount) ``` 上述代码中,如果用户输入的金额小于零,则会抛出NegativeAmountError异常,并将用户输入的金额作为参数传递给异常的构造方法。然后,可以使用try-except语句来捕获和处理这个自定义异常。 总之,通过自定义异常,我们可以更好地处理不同类型的错误,并提供有用的错误信息,帮助我们确定问题所在以及进行相应的错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值