• Python基础内容训练12(异常处理)


    一 异常和错误的概念

    在这里插入图片描述
    在这里插入图片描述

    二 常见的系统异常

    在这里插入图片描述

    • 除零异常:1/0就会报除零异常
    • 名称异常:比如你没有定义一个名称,但是你又想print这个名称就会报错
    • 类型异常:“1”+2这是字符串加数字就会报类型异常
    • 索引异常:比如列表有两个元素,但是你用【3】来访问
    • 键异常:字典里面并没有这个key,但是你用这个key来访问
    • 值异常:将字符类型转换成int型
    • 属性异常:变量没有这个属性,但是你又访问这个属性
    • 迭代器异常:用next函数取的时候,取完就没有了,不能再next了再next就会报这个异常

    在这里插入图片描述

    在这里插入图片描述
    三 如何解决异常

    对于异常来说可以预防,就比如0不能做为除数的时候,你如果加一个判断0不为除数的时候,会使得代码很繁琐。在这里插入图片描述

    • 捕捉异常初体验:
    try:
        print(name)
    except NameError:
        print('名称有问题,请仔细检查')
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    这时候不会报错,只会去走设置的异常哪里

    • 解决异常的方法一:

    在这里插入图片描述

    try:
        1/0
        print(name)
    except ZeroDivisionError as ze:
        print('除数不能为0',ze)
    except NameError as ne:
        print('名称错误',ne)
    else:
        print(123)
    finally:
        print('最后执行的内容')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    如图所示,虽然最后出现两个异常,但是优先抛出前面那个异常,优先捕获前面那个异常;as是接受异常的形参,可以print打印出来可以看到是异常的类型

    • 方案二:
      在这里插入图片描述

    在这里插入图片描述

    就是对于文件读取操作的时候,流程一般分为三个,打开文件,读取文件,关闭文件。如果读取文件的过程中出现问题的时候,代码抛出异常,就会影响后续”文件关闭“操作的执行。

    所以我们想要做一件事情就是不管这个文件有没有异常,都能正常的把文件关闭,用之前方法一的操作是下图这样,但是读取文件一般都是比较繁琐的;在这里插入图片描述
    在这里插入图片描述

    with open会调用函数所产生的上下文管理器enter方法
    as f 就代表enter方法里面的返回的文件对象赋值给f

    with open('1.png','r') as f:
        f.readlines()
    
    • 1
    • 2

    执行完读操作之后会自动执行上下文管理器里面的exit方法退出
    也就是说执行了f.close方法

    • 补充
    • 上下文管理器:在一段代码上面加上一点东西,下面加上一点东西,固定好,这样前后不用变,只要变中间即可。里面有enter和exit功能
    • contextlib模板:在这里插入图片描述

    有这个yield就是一个生成器;通过装饰器把它变成上下文管理器,也就是有进有出还有返回值

    在这里插入图片描述
    contextlib.closing是可以把有close方法的对象快速变成一个上下文管理器

    class Text():
        def t(self):
            print('ttt')
        def close(self):
            print('资源释放')
    import contextlib
    with contextlib.closing(Text()) as t_obj:
        t_obj.t()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    python2.7之前还有一个功能,这里就不介绍了。
    在这里插入图片描述
    四 如何手动的抛出异常

    在这里插入图片描述

    def set_age(age):
        if age <=0 or age>150:
            raise ValueError('值错误')
        else:
            print(f'给张三的年龄设置为{age}')
    
    set_age(-18)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    def set_age(age):
        if age <=0 or age>150:
            raise ValueError('值错误')
        else:
            print(f'给张三的年龄设置为{age}')
    try:
        set_age(-18)
    except ValueError as e:
        print('x',e)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    六 自定义异常

    
    class LessZero(Exception):
        def __init__(self,msg):
            self.msg = msg
        #描述实例对象的字符串
        def __str__(self):
            return "123"
    
    
    def set_age(age):
        if age <=0 or age>150:
            raise LessZero('值错误')
        else:
            print(f'给张三的年龄设置为{age}')
    #这个e就是上面raise后面的对象,直接printe就是获取e的str方法
    #所以返回值是123
    try:
        set_age(-18)
    except LessZero as e:
        print('x',e)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

  • 相关阅读:
    如何理解 Python 装饰器
    考研数据结构判断题整合
    【Unity2D】提升tilemap地图绘制速度的技巧
    Kafka核心原理第二弹——更新中
    【数据结构】栈和队列重点知识汇总(附有OJ题)
    【OpenVI】AIGC纪元,兔年AI绘画实践
    Visio绘制时间轴、日程安排图、时间进度图的方法
    杰理之、产线装配环节【篇】
    结合局部信息活动轮廓模型的含噪图像分割方法
    「项目管理工具」进度猫如何实现可视化?
  • 原文地址:https://blog.csdn.net/weixin_43872169/article/details/127369646