Python异常机制及自定义异常类详解,有try except为什么还要有raise?

Python的异常机制基本就三个吧,try except(finally),raise , assert。一度很迷茫这么多异常机制 感觉仅用一个就可以啊,比如说raise和assert,完全可以相同作用。但是还是找了一些资料来解释记录一下:

try except

首先是最常用的,在程序中如果不想报错后服务就挂了,就需要用好try异常机制。
如果在 try 语句块中发生异常,程序将跳转到 except 语句块。
这里就不再赘述了,因为这个知识点已经很常见了。

try:
    # 可能引发异常的代码
    # ...
except SomeException:
    # 处理 SomeException 的代码
    # ...

raise

在Python中,raise语句的作用是主动触发异常。
在不与try结合的情况下,主动raise异常就相当于让程序结束了。如下:

x = 10
if x <= 0:
    raise ValueError("x 应该是正数")

但是raise常用的方法是与try结合使用。

  1. 在try块中处理完异常后,仍需要将异常抛出,让上层调用者感知或者捕获异常。

如下:

class MyError(Exception):
    pass
try:
    raise MyError('something wrong happened')
except Exception as e:
    print('My error')
    raise

# 输出如下
'''
My error
Traceback (most recent call last):
  File "E:test.py", line 4, in <module>
    raise MyError('something wrong happened')
__main__.MyError: something wrong happened
'''

assert

assert 用于检查代码中的条件是否为真。如果条件为假,assert 语句将引发 AssertionError 异常,通常用于开发和测试阶段,以检查代码中的不变性条件是否得到满足。
我们不知道程序在哪里会出错,与其让它在运行时崩溃,不如在出现错误条件时就崩溃。代码示例如下:

def  zero(s):
    a = int(s)
    assert a > 0,"a超出范围"   #这句的意思:如果a确实大于0,程序正常往下运行
    return a

zero("-2")  #但是如果a是小于0的,程序会抛出AssertionError错误,报错为参数内容“a超出范围”

自定义异常类

最后再来说一下自定义异常类吧,主要目的是增加报错的可读性,丰富报错信息,其实没有自定义异常类也是可以的。 具体的定义方法也很简单,下面贴两个代码大家可以自己跑一下看一下, 我相信就会对自定义异常类有了一个充分的认识,授人以鱼不如授人以渔。

class CustomError(Exception):
    def __init__(self, message="发生了自定义错误"):
        self.message = message
        super().__init__(self.message)

# 使用自定义异常类
def divide(a, b):
    if b == 0:
        raise CustomError("除数不能为零")
    return a / b

# 测试
try:
    result = divide(10, 0)
    print(result)
except CustomError as ce:
    print(f"捕获到自定义异常: {ce}")
    # raise   这里可以加一个raise试试看,这样可以更深刻的理解本文所讲。
except Exception as e:
    print(f"捕获到异常: {e}")
class MyCustomException(Exception):
    '''我的自定义异常类'''

    def __init__(self, message, error_code):
        super().__init__(message)
        self.error_code = error_code

try:
    raise MyCustomException('Something wrong happened', 500)
except MyCustomException as e:
    print(e.__doc__)
    print('Error message:', e)
    print('Error code:', e.error_code)
  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值