042.Python异常处理_异常捕获

2023-12-18 14:54:57

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈

分隔线

异常捕获

异常捕获语法结构

方案1:try…except…else…finally…
  • 语法结构
    try
        可能出现异常的代码
        # (这里不管会抛出多少个异常,从上往下检测,检测到一个就立即往下去匹配,不会多次检测)
    except 要捕获的异常类别1 as 接收异常的形参1:
        对这个异常进行处理1
    except 要捕获的异常类别2 as 接收异常的形参2:
        对这个异常进行处理2
    .
    .
    .
    except 要捕获的异常类别n as 接收异常的形参n:
        对这个异常进行处理n
    [else:
        没出现异常时做的处理]
    [finally
        不管有没有出现异常,都会执行这一部分代码]
    
    
    # except 要捕获的异常类别 as 接收异常的形参:
    # 这一句在Python2.x版本中可以用","替换语句中的as
    # 但是Python3.x版本不能再用",",只能使用as
    
  • 注意:
    • try语句没有捕获到异常,先执行try代码段,再执行else,最后执行finally
    • 如果try语句捕获到异常,先执行except处理错误,再执行finally
    • 如果异常名称不确定,有想要捕捉,可以直接写Exception
  • 示例
    # 写法一
    try:
        # 1 / 0
        print(name)
    except ZeroDivisionError as e:
        print('出现除零异常', e)
    except NameError as e:
        print('出现名称异常', e)
    else:
        print('么有出现异常')
    finally:
        print('不管是否有异常,都执行')
    
    
    # 写法二
    try:
        # 1 / 0
        print(name)
    except (ZeroDivisionError, NameError) as e:
    # try部分捕获到的异常类型到这个元组里面进行循环查找
        print('出现了异常', e)
    else:
        print('么有出现异常')
    finally:
        print('不管是否有异常,都执行')
        
    
    # 写法三
    # 写法二
    try:
        # 1 / 0
        print(name)
    except Exception as e:
        print('出现了异常', e)
    else:
        print('么有出现异常')
    finally:
        print('不管是否有异常,都执行')
    
方案二:with语句
  • with 语句用于异常处理,封装了try…except…finally编码范式,提高了易用性

  • 作用

    • 适用于执行某一段代码A之前进行预处理,执行代码A结束后,进行清理操作。不管出现了什么异常,最终都要执行一些清理操作
    • 比如:文件操作with open(file) as f语句,不管是否抛出异常,都会自动执行f.close()关闭文件
  • 语法

    with context_expression [as target(s)]:
        with-body
        
    
    # context_expression    # 上下文表达式
    # with-body             # 语句体
    
    # 上下文表达式:要求必须要返回一个“上下文管理器”的表达式
    # 上下文管理器:实现了“上下文协议”的对象
    # 上下文协议:必须要实现`__enter__()`(进入)方法和`__exit__()`(退出)方法
    
  • 执行流程

    1、context_expression上下文表达式要返回一个上下文管理器对象
    2、调用“上下文管理器”的__enter__()方法
    3、如果写了as target语句,则把__enter__()方法的返回值赋值给target
    4、执行 语句体
    5、执行“上下文管理器”的__exit__()方法
    
    • 在这里插入图片描述
  • with语句示例

  • 示例前提解析

    # 文件读取操作正常步骤
        # 1、打开文件   f = open('xxxx.xx')
        # 2、读取文件   f.readlines()   ---> 如果这一行代码抛出异常,就会影响后续“文件关闭”操作的执行
        # 3、关闭文件   f.close()
    
    • 整个文件操作步骤中,如果读取文件操作抛出异常,则会影响后续的文件关闭操作,导致文件无法关闭
    • 于是,我们想保证,不管读取文件有没有异常,都要关闭文件
  • 使用try...except语句解决

    try:
        打开文件
        读取文件
    except Exception:
        异常处理
    finally:
        关闭文件
    
    • 使用try...except语句解决写法过于繁琐,如果有几十个文件操作,就要写几十遍try...except语句
  • 使用with语句解决

    with open(file) as f:
        读取文件
        
    # open(file) 是上下文表达式,会返回一个“上下文管理器”
    # 执行“上下文管理器”的__enter__()方法
    # 将__enter__()方法的返回值(文件对象)赋值给f
    # 执行 读取文件 操作
    # 执行“上下文管理器”的__exit__()方法(在__exit__()方法内封装了文件关闭操作)
    
  • with语句问题点

  • 上述代码中并不能捕获异常也没有做异常处理,仅仅是做了自动的文件关闭操作

  • 要捕获异常,就要给读取文件操作套上try语句

    with open(file) as f:
        try:
            读取文件
        except Exception:
            print('捕获异常,异常处理')
    
  • 要捕获异常,也可以通过自定义上下文管理器来捕获

文章来源:https://blog.csdn.net/weixin_50296259/article/details/135060698
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。