python异常处理与上下文管理器

异常处理的艺术:Python 上下文管理器的应用 本文介绍了如何使用Python的上下文管理器简化异常处理。通过contextlib.contextmanager装饰器,可以将重复的异常捕获和包装逻辑封装成可重用的上下文管理器,从而减少代码冗余。文章展示了如何创建异常包装器,将其应用于实际场景,并说明了这种方法的优势:提高代码可读性、可维护性,让开发者更专注于业务逻辑。这种方法特别适合需要统一处理多处异常的情况。 阅读详情
python异常处理
异常与错误
  • 错误

    • 语法错误

    可以通过IDE或者解释器给出提示的错误
    opentxt('a.jpg','r')

    • 逻辑错误

    语法层面没有问题,但是自己代码的逻辑有问题
    if age>18: print('未成年')

  • 异常

    多指在程序执行过程中,出现的未知错误,语法和逻辑本身是正确的。可以通过代码进行处理或修复

异常分类
  • 除零异常(ZeroDivisionError):

1/0

  • 名称异常(NameError):

if age>5,age未定义

  • 类型异常(TypeError):

1+'abc'

  • 索引异常(IndexError):

a=[1,2,3] a[4]

  • 键异常(KeyError):

a={'a':1,'b':2} a['c']

  • 值异常(ValueError)

int('abcd')

  • 属性异常(AttributeError)

name='Dracular' print(name.age)

  • 迭代器异常(StopIteration)

a=iter([1,2]) print(next(a)) print(next(a)) print(next(a))

  • 系统异常类继承树(BaseException所有内建的异常基类)

    • SystemExit

    由sys.exit(0函数引发,当他不处理时,python解释器退出)

    • KeyboardInterrupt

    当用户中断操作引发(ctrl +c)

    • GeneratorExit

    当调用一种generator的close()方法引发

    • Exception

    所有内置的、非系统退出异常是从该类派生的,因为该类派生所有用户定义的异常

异常处理格式
# python 的完整异常处理格式,原谅我蹩脚的英语注释,哈哈...
# python 2 中except exception_type, error
# python 3 中except exception_type as error
try:
	do something
except exception_type1:
    when get exception_type1 error
except exception_type2:
    when get exception_type2 error
except exception_typen:
	when get exception_type2 error
else:
	if not get error,into here
finally:
    always execute it ...
多种异常捕获

刚才介绍了很多异常的分类,也看到了异常处理的格式,那么针对多种异常如何更简洁的捕获呢?

  • 将多个异常通过元组归类到一起

    except (ZeroDivisionError,NameError) as error:

  • 使用Exception这个基类全部捕获

    except Exception as errorinfo:

使用with处理异常

用于执行一段代码前,进行预处理,执行完成这段代码后,进行清理操作
with content_expression[as target(s)]: withbody
大家用到最多的莫过于在读写文件时,使用with open

with open('a.txt','a') as file :
	file.write('first line...')

为什么说他是一个上下文处理器呢?
首先咱们在文件读写的时候主要分三个步骤:

  1. 打开文件
  2. 操作文件的内容
  3. 关闭文件

正常情况下,我们使用的方式为:

f=open('a.txt', 'a')
f.write('first line...')
f.close()

那么如果我们在操作文件的时候,出现了异常导致系统退出,就无法正常的关闭文件
但使用with的上下文管理器,就可以达到异常退出时的清理操作!
可是没有论证,空口在这里吹逼不太好啊,举个例子来验证with自带的异常清理。
先看下这段代码:

import os
try:
    f=open('a.txt', 'a+')
    f.write('first line...')
    raise ValueError
except:
    os.rename('a.txt','b.txt')
f.close()

output:
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'a.txt' -> 'b.txt'

我们在写文件的时候,手动出发一个异常,然后在except捕获异常后,去重命名该文件。
然后由于没有正常的关闭,此时你去重命名会给出文件正在占用的提示
那同样的方式,我们使用with操作看看效果:

import os
try:
    with open('a.txt', 'a+') as file:
        file.write('first line...')
        raise ValueError
except:
    os.rename('a.txt','b.txt')

此时正常执行完成,程序没有抛出异常,为什么?因为在上下文处理器中,with捕获异常后,自动的执行了文件的关闭操作,溜不溜?

上下文管理器原理

所谓上下文管理器的原理,其实就是以下三点

  1. 调用__enter__ 方法,进行预处理操作
  2. 执行用户操作
  3. 调用__exit__方法,完成清理操作

知道了原理,让我们通过自己编写的上下文管理器,重构一下open的方法,让它装逼即耀眼又安全吧

import os
# 自定义一个上下文管理器
class zhuang13_open:
    def __init__(self, file, mode):
        self.file = file
        self.mode = mode

    def __enter__(self):
        print('启动装13模式,打开文件-->%s' % self.file)
        self.file = open(self.file, mode=self.mode)
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('乱花从中过,片叶不沾身\n装完13,记得擦屁股啊')
        self.file.close()

# 依旧测试下在异常的情况下是否可以正常关闭文件
try:
    with zhuang13_open('a.txt', 'a+') as file:
        file.write('first line...')
        raise ValueError
except:
    os.rename('a.txt', 'b.txt')

完美结束…

了解下刚才的__exit__

刚才看到在定义__exit__方法时,自带了三个参数exc_type, exc_val, exc_tb
这是什么呢?分别为:异常类别,异常值,追踪信息,怎么看他的值呢?
把上面代码中raise ValueError改为1/0
在__exit__方法中加入print(exc_type, exc_val, exc_tb)
得到如下结果:

<class 'ZeroDivisionError'> division by zero <traceback object at 0x00000000032BADC8>
大家会问到追踪信息是什么呢?其实大家天天见…当你代码错误了,提示哪一行有问题的时候,这个帮你定位的东西,就是追踪信息。
想看到追踪信息需要引入一个模块,traceback
继续在__exit__中添加这两行信息

import traceback
print(traceback.extract_tb(exc_tb))

output:

[('E:/Python/xxxx/b.py', 21, '<module>', 'raise ValueError')]
上面个list什么意思呢? 错误的文件,错误的行号,文件类型,错误的语句

是不是吊炸天?好了今天就学到这里,碎觉…

©本文由简书作者:清风Python 原创 如需转载请注明

STM32_DAC DAC(Digital-to-Analog Converter,数模转换器)是将数字信号转换为模拟信号的外设,广泛应用于音频输出、波形生成、电机控制等场景。STM32F407 系列芯片配备了 2 个 DAC 通道(DAC1 和 DAC2),支持 12 位分辨率,支持多种触发方式,可输出稳定的模拟电压。本文从 DAC 的基本原理出发,详细讲解 STM32F407 DAC 的配置方法、代码实现、波形生成以及实际应用案例,帮助你快速掌握 DAC 的使用技巧。 阅读详情

相关推荐

Research Proposal:自动驾驶 行人运动预测

Research Proposal about Pedestrian/Cyclist Motion Prediction for Self-Driving Vehicles   If I can be provided with the opportunity to conduct PhD research in pedestrian/cyclist motion prediction for...

Poetry Wanderer的博客 3087

Python学习笔记——异常处理(try/except、except...as、处理上下文管理器的__exit__异常、自定义异常)

异常类型 Python内置异常 解释器采用一个层次结构组织异常 所有内置异常(也包括自定义异常)都继承了一个名为Exception的类 BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- Floatin

Insomnia_X的博客 2327

DeerFlow 系列教程 第十四篇 | IM 渠道集成——让 DeerFlow 接入飞书、企微、Slack、Telegram

DeerFlow 系列教程 第十四篇本篇教程继续,全面剖析 DeerFlow 的 IM 渠道集成方案。我们将深入理解 Channel 抽象层设计、MessageBus 消息总线机制、ChannelManager 调度循环、四大 IM 平台(飞书、企业微信、Slack、Telegram)的适配实现,以及从 IM 消息到 Agent 响应再到 IM 回复的完整消息流转过程。

weixin_43674738的博客 416

python异常和错误的区别_python的错误和异常怎么区别

python异常和错误有什么区别1. 错误从软件方面来说,错误是语法或是逻辑上的。语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译。这些错误必须在程序执行前纠正。当程序的语法正确后,剩下的就是逻辑错误了。逻辑错误可能是由于不完整或是不合法的输入所致;在其他情况下,还可能是逻辑无法生成,计算,或是输出结果需要的过程无法执行。这些错误通常分别被称为域错误和范围错误。当 Python...

weixin_39548740的博客 718

在 SAP ECC 中定义 ledger 时遇到 “Define exactly one leading ledger“(消息号 FAGL_LEDGER_CUST012)的错误

摘要:SAP系统要求必须且只能定义一个主导分类账(Leading Ledger)。当出现错误消息FAGL_LEDGER_CUST012时,需通过事务码FINSC_LEDGER或SPRO路径检查分类账配置,确保仅有一个分类账被标记为"LeadingLedger",其余设为"Non-leadingLedger"。主导分类账是SAP默认用于标准报表的核心分类账,修改配置需谨慎以免影响已有数据。若问题未解决,建议检查未完成配置或查阅SAP Notes获取解决方案。

金牌架构师 802

STM32入门教程:人脸识别

STM32CubeMX配置 打开STM32CubeMX,创建一个新的工程,并选择你使用的STM32系列和具体型号。根据摄像头模块的规格,将摄像头的输出引脚连接到相应的STM32引脚上。人脸识别是一种非常常见的人工智能应用,它可以通过摄像头捕捉到的图像,识别出图像中的人脸并进行相关的分析和处理。在本教程中,我们将使用STM32开发板和相关传感器,通过指导你搭建一个基于STM32的简单人脸识别系统,并编写相应的代码来实现该功能。另外,为了达到更好的人脸识别效果,可能需要使用更高性能的处理器和更复杂的算法。

吃不胖. 374

python错误与异常

简单介绍了python异常与错误

qq_49080356的博客 925

利用 AI 自动生成 BDD(行为驱动开发)格式的 Gherkin 测试用例

文章摘要 当前BDD测试领域正经历AI驱动的变革浪潮。传统Gherkin用例编写面临四大痛点:语法负担重、场景发现成本高、一致性差和维护困难。2025-2026年,AI生成Gherkin的工具生态快速成熟,主要分为五类:测试管理平台内置AI(如TestRail 10.2)、Jira插件(如AssertThat BDD)、独立AI平台(如PrimeCompass)、CLI工具和研究原型。其中,TestRail实现生成-执行闭环,AssertThat采用多阶段Agent工作流提升质量,PrimeCompass则

ZXSXJ的博客 205

python中异常和错误是同一个概念吗_一文搞懂Python错误和异常

写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常。先抛出两个问题:什么是Python错误和异常?如何处理Python错误和异常?1、语法错误语法错误可能是初学者最常遇到的,如下面熟悉的画面:SyntaxError:invalidsyntax语法错误又称解析错误,又有老哥会问什么是解析错误?简单来说是基本语法结构写错了,如:...

weixin_34539480的博客 1623

华为OD机试 双机位A卷 - 流量波峰 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位A卷 流量波峰,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 1377

HFSS实战项目——高带外抑制特性SIW带通滤波器

本文对单级滤波器和双级滤波器的设计、工作原理及仿真结果进行了详细分析,并验证了双级SIW带通滤波器在性能方面的优越性,为微波通信系统中滤波器的设计和应用提供了重要参考。

2401_87464239的博客 1816

python上下文管理器的作用?手写一个支持异常处理的上下文管理器。

Python的上下文管理器(Context Manager)用于管理资源的获取和释放,确保资源(如文件、网络连接、数据库连接等)在使用后被正确清理,即使代码执行过程中发生异常。它通过with语句实现,核心是__enter__和__exit__方法,其中__exit__可以处理异常。

qq_62784677的博客 215

【大模型】DeepSeek 高级提示词技巧使用详解

DeepSeek 高级提示词技巧使用详解

congge 1万+

深度解析Python上下文管理器:优雅资源管理与异常处理

Python中的上下文管理器是一种强大的工具,用于优雅地管理资源和处理异常。本文深入探讨了上下文管理器的工作原理,解释了它如何确保资源的获取和释放,以及在异常情况下的可靠表现。通过示例和详细解释,读者将了解到如何创建自定义上下文管理器以及利用contextlib模块简化上下文管理器的使用。最终,本文强调了上下文管理器在Python编程中的重要性,并展示了如何通过它来编写更清晰、可靠的代码。

qq_41586251的博客 2243

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Python】详解 with 语句 (上下文管理器) —— 异常处理完全解读 (下)

Python 对一些内建对象进行改进,加入了对上下文管理器的支持。上下文管理器的典型用途包括:保存和恢复各种全局状态、锁定和解锁资源、关闭已打开的文件等,且常使用 with 语句调用。

闻韶 3431

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

自定义上下文管理器contextlib模块@contextlib.contextmanager装饰器contextlib.closing函数contextlib.nested函数(Python3.x 已弃用)实际上就是创建一个类,实现(进入)方法和__exit__()(退出)方法在(进入)方法中执行一些准备操作__exit__()(退出)方法会接收到语句体执行时抛出的异常类型、异常的值和追踪信息示例# 自定义上下文管理器print('enter方法')return 'enter方法的返回值'

weixin_50296259的博客 994

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python模块导入&异常处理&上下文管理器

模块导入 # 导入模块的时候---》一层一层的定位(可以定位到模块或函数),除开顶级目录 # (因为一般情况下,只会打开一个项目,所以都在一个项目下,可以不写顶级目录) # 第一种方法:import # import week5.class_0213.math_add #导入指定路径下的add模块,写到模块名就好,不要加.py后缀 # res = week5.class_0213.math...

weixin_42464673的博客 266

你的 with 为何“吞”掉了异常?——Python 上下文管理器的资源控制与异常处理迷雾

Python 上下文管理器异常处理陷阱解析 with语句是Python管理资源的推荐方式,但自定义上下文管理器时常见三个陷阱:1)__enter__返回错误对象导致变量绑定异常;2)__exit__不当处理异常,要么吞没关键错误要么引发新异常掩盖原始问题;3)忽视__exit__返回值对异常传播的控制。这些错误会导致资源泄漏或难以排查的异常消失问题。 典型场景包括:__exit__返回True压制所有异常;清理代码抛出异常覆盖业务异常;__enter__返回管理器自身而非资源对象。标准库contextlib

深山技术宅的博客 368

Python的__enter__和__exit__:上下文管理器的异常处理

在Python中,上下文管理器通过`__enter__`和`__exit__`方法实现了资源的自动管理,例如文件操作或数据库连接。若`__exit__`返回`True`,异常会被捕获;例如,使用`with`语句打开文件时,即使内部代码抛出异常,`__exit__`也会自动关闭文件句柄。`__exit__`的异常处理能力比`finally`更灵活,适合复杂场景。掌握`__enter__`和`__exit__`的用法,不仅能提升代码的健壮性,还能让资源管理更加优雅高效。**上下文管理器的嵌套**

akdmbe_506的博客 202

Python文件操作指南:读写、异常处理与上下文管理器详解

文件读写是编程中常见的 I/O 操作,掌握文件操作的基本步骤、常用方法以及异常处理是 Python 编程的基础之一。通过with语句和上下文管理器,能够更加简洁、安全地进行文件操作。同时,理解文件指针的概念以及其他文件对象的方法,可以更灵活地处理文件的读写。良好的文件读写习惯有助于编写清晰、健壮的程序。

fzlhz的博客 68

Python上下文管理器:优雅实现资源管理与异常处理

上下文管理器是Python中实现资源管理的重要机制,通过__enter__和__exit__两个特殊方法确保资源的正确获取和释放。其核心原理是利用with语句创建执行环境,无论代码块是否发生异常都能可靠地执行清理操作。在实际工程中,这种模式被广泛应用于文件操作、数据库连接、线程锁等场景,能有效避免资源泄漏问题。Python标准库中的contextmanager装饰器进一步简化了实现过程,通过生成器函数将资源管理逻辑封装为可复用的上下文管理器。结合异常处理和性能优化技巧,开发者可以构建出既安全又高效的资源管理

weixin_29758911的博客 319

Python异常处理全解析:从try-except到上下文管理器与实战

在编程中,异常处理是构建健壮、可靠软件的核心机制。其原理在于,当程序执行遇到非预期状况时,通过抛出异常对象来中断当前流程,并沿调用栈向上寻找匹配的处理逻辑。这项技术的核心价值在于,它允许开发者将正常的业务逻辑与错误处理逻辑分离,从而提升代码的可读性、可维护性和容错能力。无论是处理用户输入验证、文件I/O操作、网络请求超时,还是数据库事务管理,精准的异常捕获都是保障程序稳定运行的关键。本文深入探讨了Python中try-except-else-finally的完整语法、异常类的继承体系,并结合上下文管理器(w

weixin_32612263的博客 286

【Python】【进阶】上下文管理器

上下文管理器

yao123698745的博客 2040
上一篇: python原类、类的创建过程与方法
下一篇: python上下文管理器细读
清风 python
博客等级 码龄9年 64粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值