043.Python异常处理_自定义上下文管理器

news2025/1/4 15:53:12

无奋斗不青春

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

分隔线

自定义上下文管理器

    • 自定义上下文管理器
    • contextlib模块
      • @contextlib.contextmanager装饰器
      • contextlib.closing函数
      • contextlib.nested函数(Python3.x 已弃用)

自定义上下文管理器

  • 实际上就是创建一个类,实现__enter__()(进入)方法和__exit__()(退出)方法
  • __enter__()(进入)方法中执行一些准备操作
  • __exit__()(退出)方法会接收到语句体执行时抛出的异常类型、异常的值和追踪信息
  • 示例
    # 自定义上下文管理器
    class Test:
        def __enter__(self):
            print('enter方法')
            return 'enter方法的返回值'
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            """
            exc_type:异常类型
            exc_val:异常的值
            exc_tb:追踪信息对象Traceback
            """
            print('exit方法', exc_type, exc_val, exc_tb)
    
    
    # 使用自定义上下文管理器
    with Test() as x:
        print(x)
        1 / 0
    
    
    
    # ============输出结果============
    # enter方法
    
    # enter方法的返回值
    
    # exit方法 <class 'ZeroDivisionError'> division by zero <traceback object at 0x000002009555F400>
    
    # Traceback (most recent call last):
    #   File "E:\StudyCode\Python\14-异常处理\03-自定义上下文管理器.py", line 12, in <module>
    #     1 / 0
    # ZeroDivisionError: division by zero
    
  • 示例解析
    # with 后面的 Test() 是创建一个类实例对象-上下文管理器
    # 自动执行上下文管理器对象内部的 __enter__() 方法
        # 比如文件操作的 open(),就可以把文件打开操作放到 __enter__() 方法内部
    # 执行完 __enter__() 方法,会把这个方法的返回值赋值给 with 语句中 as 后面的变量 x
    # 执行语句体: print(x) 和 1 / 0
    # 最后自动执行上下文管理器对象内部的 __exit__() 方法,这个方法会接收到语句体抛出的异常(包含:异常类型、异常值和追踪信息对象)
    # __exit__() 方法的返回值为 True 则不会再将接收到的异常往外抛出,如果返回值为 False 则将接收到的异常继续往外抛出
    # 所有最后的清理操作都可以写到 __exit__() 方法中(比如文件操作中最后的关闭文件操作)
    
  • __exit__()方法中接收到的追踪信息对象,我们也可以获取到对象的相关信息
    # 自定义上下文管理器
    class Test:
        def __enter__(self):
            # print('enter方法')
            return 'enter方法的返回值'
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            """
            exc_type:异常类型
            exc_val:异常的值
            exc_tb:追踪信息对象
            """
            # print('exit方法', exc_type, exc_val, exc_tb)
            
            # 获取追踪信息对象的内容
            import traceback
            print(traceback.extract_tb(exc_tb))
            
            return True
    
    
    # 使用自定义上下文管理器
    with Test() as x:
        # print(x)
        1 / 0
        
        
    # ========== 输出结果 ==========
    # [<FrameSummary file E:\StudyCode\Python\14-异常处理\03-自定义上下文管理器.py, line 22 in <module>>]
    

contextlib模块

@contextlib.contextmanager装饰器

  • 作用
    • 使用装饰器,让生成器变成上下文管理器
  • 知识回顾
    • 生成器:包含 yield 语句的函数,这个函数的执行结果就是“生成器”
    • 关于生成器
    def Test():
        print('Text函数', 1)
        yield '返回值1'
        print('Text函数', 2)
    
  • 使用装饰器,让生成器变成上下文管理器
    import contextlib
    
    @contextlib.contextmanager
    def Test():
        print('Text函数', 1)
        yield '返回值1'
        print('Text函数', 2)
    
    
    with Test() as x:
        2 / 1
        print(x)
        
    
    # ========== 输出结果 ==========
    # Text函数 1
    # 返回值1
    # Text函数 2
    
  • 执行分解
    • 使用@contextlib.contextmanager装饰之后
    • yield之前的语句就是上下文管理器中的__enter__方法
    • yield语句就是执行 语句体
    • yield之后的语句就是上下文管理器中的__exit__方法
  • 应用示例
    import contextlib
    
    @contextlib.contextmanager
    def Test():
        try:
            yield
        except Exception as e:
            print('异常:', e)
    
    
    with Test() as x:
        2 / 0
    
    
    # ========== 输出结果 ==========
    异常: division by zero
    
    
    # 步骤解析
    # try语句写在yield之前,会先执行
    # 通过yield语句执行语句体 2/0,会抛出异常
    # 执行yield后面的except语句捕获异常
    

contextlib.closing函数

  • 作用
    • 使用函数,让拥有close()方法但不是上下文管理器的对象变成上下文管理器
    • 注意:这个对象中必须要有close()方法,而且是要求最后必须执行close()方法
  • 通过案例讲解
    • 有一个如下的类对象
      class Test:
          def tt(self):
              print('tt方法')
      
          def close(self):
              print('对象关闭,释放资源')
      
    • 使用需求:Test类实例对象每次调用完tt()方法后,都需要执行close()方法关闭对象,释放资源
    • 按照我们刚学的上下文管理器进行操作,就需要再Test类当中增加__enter__()__exit__()两个方法
      class Test:
          def tt(self):
              print('tt方法')
      
          def close(self):
              print('对象关闭,释放资源')
      
          def __enter__(self):
              return self
      
          def __exit__(self, exc_type, exc_val, exc_tb):
              self.close()
      
      
      # 要求:Test类实例对象每次调用完tt()方法后,都需要执行close()方法关闭对象,释放资源
      with Test() as x:
          x.tt()
      
      # ========== 输出结果 ==========
      # tt方法
      # 对象关闭,释放资源
      
      
      # 解析:为什么要在__enter__中返回一个self
      # 因为我们需要在with语句里面去执行实例方法tt(),所以我们需要拿到这个实例对象
      # 通过__enter__方法使用self将这个实例对象返回,就可以将这个实例对象赋值给with语句中的x
      # 再通过 x 去调用实例方法 tt()
      
    • 这样写的话,就每次都要添加__enter__()__exit__()两个方法,比较麻烦
    • 我们可以通过contextlib.closing()函数来解决这个问题
      class Test:
          def tt(self):
              print('tt方法')
      
          def close(self):
              print('对象关闭,释放资源')
      
      
      # 要求:Test类实例对象每次调用完tt()方法后,都需要执行close()方法关闭对象,释放资源
      
      import contextlib
      
      with contextlib.closing(Test()) as x:
          x.tt()
      
    • 只需要在with语句中使用contextlib.closing()函数就能达到上面增加__enter__()__exit__()两个方法的效果

contextlib.nested函数(Python3.x 已弃用)

  • contextlib.nested()函数在Python3.x中已经已弃用,仅做了解即可!
  • 作用
    • 在Python2.7版本之前,完成多个上下文管理器的嵌套
  • 通过案例讲解
    • 需求:读取一个文件所有内容,再把内容写入到另一个文件中
    • 在Python2.7版本之前的写法
    with open('xx.jpg', mode='rb') as form_file:
        with open('xx2.jpg',mode = 'wb') as to_file:
            file_content = form_file.read()
            to_file.write(file_content)
    
    • 这样写的话,就需要用到多个open()对象的上下文管理器做嵌套
    • 在Python2.7之前,就可以用contextlib.nested()函数来处理
    import contextlib
    
    with contextlib.nested(open('xx.jpg', mode='rb'), open('xx2.jpg', mode='wb')) as (form_file,to_file):
        file_content = form_file.read()
        to_file.write(file_content)
    
    • 但是,在Python3.x版本对这种多个上下文管理器的嵌套进行了优化,也不在需要用contextlib.nested函数了
    with open('xx.jpg', mode='rb') as form_file, open('xx2.jpg', mode='wb') as to_file:
        file_content = form_file.read()
        to_file.write(file_content)
    
    • 关于这个函数我们只需要了解一下就行,记住Python3.x版本的写法即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32 核心闪存损坏

问题描述&#xff1a;使用Platform 开发ESP32-S3 报错通过串口打印报错提示为核心闪存损失具体报错如下。 ELF file SHA256: 25c739c3d81d8f15 E (183) esp_core_dump_flash: Core dump flash config is corrupted! CRC0x7bd5c66f instead of 0x0 Rebooting... ESP-ROM:esp32s3…

Python项目——表白照片墙

1、介绍 利用女神的照片&#xff0c;组成女神的名字&#xff0c;向女神表白。如下图&#xff1a; 原理&#xff1a;获取每个像素点的颜色&#xff0c;白色不贴图&#xff0c;黑色贴图。 2、工具 语言&#xff1a;python3.11编译器&#xff1a;PyCharm包&#xff1a;pygame p…

【IOS开发】传感器 SensorKit

资源 官方文档 https://developer.apple.com/search/?qmotion%20graph&typeDocumentation SensorKit 使应用程序能够访问选定的原始数据或系统从传感器处理的指标。 步骤信息加速度计或旋转速率数据用户手腕上手表的配置物理环境中的环境光有关用户日常通勤或旅行的详细…

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案

使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用微服务如&#xff1a;商品、订单、购物车、个人中心、支…

项目实操四-性能测试过程实时监控分析

这里写目录标题 一、JMeter性能测试技巧1、CSV文件驱动2、定时器a、泊松随机定时器b、固定定时器c、高斯随机定时器d、均衡随机定时器e、同步定时器f、固定吞吐量定时器g、精准吞吐量定时器 3、全局变量 - 跨线程数据传递4、Debug调试器5、JMeter执行机端口被占用 二、JMeter性…

Linux集群实用脚本

现有三台虚拟机&#xff0c;例如&#xff1a;node2、node3、node4 三台虚拟机配置了免密登录&#xff0c;安装了hadoop等软件。 相关集群实用脚本命令 统一执行jps命令 jpsall #!/bin/bash ​ for host in node2 node3 node4 doecho $host ssh $host jps done ​ 统一执行命…

JVM日常故障排查小结

前置知识 jstack简介 jstack是JVM自带的工具&#xff0c;用于追踪Java进程线程id的堆栈信息、锁信息&#xff0c;或者打印core file&#xff0c;远程调试Java堆栈信息等。 而我们常用的指令则是下面这条: # 打印对应java进程的堆栈信息 jstack [ option ] pid option常见选…

AI摄影绘画与PS优化:重塑数字艺术的未来

文章目录 《AI摄影绘画与PS优化从入门到精通》内容简介作者简介楚天 目录前言/序言 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的各个领域&#xff0c;包括艺术创作。AI摄影绘画和Photoshop&#xff08;PS&#xff09;优化是这个领…

[AI工具推荐]AiRestful智能API代码生成

智能API代码示例生成工具AiRestful 一、产品介绍二、如何使用1、第一步(必须):2、第二步(可选):3、第三步(智能生成): 三、如何集成到您的网站(应用)1、开始接入2、接入案例 四、注意点 一、产品介绍 AiRestful是一款基于智能AI的,帮助小白快速生成任意编程语言的API接口调用示…

中国经济增长:全球复苏的引擎

近年来&#xff0c;中国经济以其强劲的增长势头成为全球经济的重要引擎。中国的经济崛起不仅对自身国家发展具有重要意义&#xff0c;而且也对全球经济复苏和稳定有着积极影响。本文将从多个角度探讨中国经济增长对全球经济的影响及其作为全球复苏的引擎。 首先&#xff0c;中国…

基于SpringBoot的房屋租赁系统 附源码

基于SpringBoot的房屋租赁系统 附源码 文章目录 基于SpringBoot的房屋租赁系统 附源码 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 本文介绍了一个基于SpringBoot的房屋租赁系统。该系统利用SpringBoot框架的优势&#xff0c;实现了用户注册、登…

【C++】封装:练习案例-点和圆的关系

练习案例&#xff1a;点和圆的关系 设计一个圆形类&#xff08;Circle&#xff09;&#xff0c;和一个点类&#xff08;Point&#xff09;&#xff0c;计算点和圆的关系。 思路&#xff1a; 1&#xff09;创建点类point.h和point.cpp 2&#xff09;创建圆类circle.h和circle…

如何搭建企业管理系统Odoo并远程访问管理界面【内网穿透】

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

SearchWP WordPress高级网站内容搜索插件(包含所有专业扩展)

点击阅读SearchWP WordPress高级网站内容搜索插件(包含所有专业扩展)原文 SearchWP WordPress高级网站内容搜索插件是一个非常强大的工具&#xff0c;可以显着增强您网站的搜索功能。通过向网站访问者提供高度相关和精确的搜索结果&#xff0c;它可以有效地简化他们的搜索过程…

回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 &#xff08;多指标…

苹果个人开发者如何实现应用下载安装

作为苹果个人开发者&#xff0c;你可以为iOS设备用户提供应用程序&#xff0c;而用户将能够通过下载和安装这些应用来丰富他们的设备体验。本文将详细介绍个人开发者实现应用下载安装的步骤&#xff0c;包括开发和上架应用程序到App Store。 图片来源&#xff1a;苹果个人开发者…

【轮式移动机器人课程笔记3】移动机器人运动学简介

文章目录 写在前面L3 移动机器人运动学简介3.1 运动学概述3.2 研究机器人运动学的意义3.3 机器人运动的描述3.4 机器人正微分运动学3.5 机器人逆微分运动学3.6 总结 写在前面 前两节课介绍了移动机器人、机械手、类型&#xff0c;本节课重点讲解移动机器人运动学相关知识&…

一个IP证书里可以包含多个ip地址吗

IP地址数字证书是一种由权威机构颁发的数字证书&#xff0c;是只拥有公网IP地址的网站用来保护数据传输安全&#xff0c;防止网站信息被窃取、篡改的安全传输协议。IP证书还可以消除浏览器的“不安全”提示&#xff0c;让网站更容易获得客户信任。同常一个IP证书只能同时保护一…

经典文献阅读之--EA-NDT(利用语义分割提高NDT地图压缩和描述能力的框架)

0. 简介 对于NDT而言&#xff0c;相信各位应该都有所了解了&#xff0c;但是作为高精地图来说性能还需要进一步提升&#xff0c;为此《Towards High-Definition Maps: a Framework Leveraging Semantic Segmentation to Improve NDT Map Compression and Descriptivity》一文提…

AIGC实战——条件生成对抗网络(Conditional Generative Adversarial Net, CGAN)

AIGC实战——条件生成对抗网络 0. 前言1. CGAN架构2. 模型训练3. CGAN 分析小结系列链接 0. 前言 我们已经学习了如何构建生成对抗网络 (Generative Adversarial Net, GAN) 以从给定的训练集中生成逼真图像。但是&#xff0c;我们无法控制想要生成的图像类型&#xff0c;例如控…