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什么意思呢? 错误的文件,错误的行号,文件类型,错误的语句

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

© 本文由简书作者 一梦七年诗原创,优快云:https://blog.youkuaiyun.com/SlaughterDevil/ ,转载请注明!

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

CE 7.4中文版实战:如何用自动汇编功能快速生成游戏修改器(附CT表保存技巧) 本文详细介绍了CE 7.4中文版中自动汇编功能的使用方法,帮助用户快速生成游戏修改器。从环境配置、内存地址定位到自动汇编代码注入,再到CT表保存和独立EXE生成,提供全流程实战指南,适合逆向工程爱好者和游戏修改器开发者。 阅读详情

相关推荐

hcaptcha逆向实战:从API解析到参数构造的完整链路

本文详细拆解了hcaptcha验证码的逆向实战流程,从环境准备、捕获API与版本号,到解析核心加密逻辑hsw.js,再到构造getcaptcha请求参数,最后完成验证提交。文章重点剖析了motionData、n、c等关键参数的获取与构造方法,为开发者模拟浏览器行为、实现自动化验证提供了清晰的完整链路指南。

ik678901的博客 629

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

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

Insomnia_X的博客 2327

揭秘个人开发者接支付宝的‘野路子’:不用企业资质,用Python模拟扫码转账与回调监听

本文探讨了个人开发者如何通过Python模拟支付宝扫码转账与回调监听的技术实现,解析了支付宝URL协议格式,并设计了本地化的支付状态监听方案。文章强调该方法仅用于技术研究,实际应用需遵守支付宝官方接口和金融合规要求。

weixin_30736301的博客 409

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

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

weixin_39548740的博客 718

Anroid8.1 强制修改系统可以adb remount

在Android6.0 (Android M)user版本上,发现使用adb root后再adb remount系统之后会提示这样信息:remount of /system failed: Read-only file system,这是不能对system分区进行操作,提示没有写权限,为只读文件系统Read-only file system,因为系统本身在user就不支持可写操作,我们就不能adb push来调试apk,如果想调试apk就需要修改system、vendor权限问题。 如下现象: C:\Use

wq892373445的博客 1408

史上最详细的sqlmap使用教程

sqlmapsqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等Sqlmap采用了以下5种独特的SQL注入技术基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。

大河之犬的博客 5万+

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

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

weixin_34539480的博客 1623

图像处理之边缘检测[微分算子、Canny算子和LOG算子]

LOG算子是在经典算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。边缘总是以强度突变的形式出现,可以定义为图像局部特性的不连续性,如灰度的突变和纹理结构的突变等。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构。对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,而需要采用更加复杂的3X3的算子比如Prewitt算子。对于离散的图像f(x,y),边缘检测算子是用图像的垂直和水平差分来逼近梯度算子,即。

qq_44111805的博客 9837

让你瞬间搞懂Python 错误与异常

Python中有两种错误:语法错误(SyntaxError)和异常。 assert(断言)用于判断一个表达式,在表达式条件为false时触发异常。 Python中的异常类型 异常处理 一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。 处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。 一个ex...

柒殇aq的博客 1130

RK3568平台(USB篇)USB基础知识

现象:把USB设备比如Android手机接到PC答1:是USB控制器,是USB控制器内嵌的root hub.答2. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone"提示你安装的是"设备驱动程序"。USB总线驱动程序负责:识别USB设备, 给USB设备找到对应的驱动程序。答3. PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平USB设备的USB口内部,D-或D+接有1.5K的上拉电阻;

weixin_49303682的博客 1658

《Python基础教程》内容总览篇(持续更新中)

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为优快云博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理解,而且能够帮助新手快速入门。个人精心开设的《Python基础课程》专栏订阅量接近900,帮助不少同学解决了Bug。

weixin_43178406的博客 35万+

python的错误和异常

python错误和异常 错误 错误分为语法错误和逻辑错误 语法错误 >>> if File "<stdin>", line 1 if ^ SyntaxError: invalid syntax 程序执行过程中,python解释器会检测你的程序是否存在语法错误,如果程序出错python解释器会指出出错的一行,并且在最先...

weixin_34226706的博客 326

coze 怎么读取excel文件,使用循环,数据库完成LLM问答并存储

本文介绍了如何在Coze平台实现"Excel读取+循环处理+LLM问答+数据库存储"的工作流。主要分为三个步骤:1)使用代码节点解析Excel文件为问答对数组;2)通过循环节点遍历问答对,调用LLM节点生成回答;3)利用数据库节点将问答结果存储到Coze内置数据库中。文中提供了代码示例和节点配置说明,并强调了注意事项如Excel格式要求、LLM调用频率控制等。该工作流适用于批量构建知识库问答系统并持久化存储结果。

ZhangJiqun&191cm&85kg 1792

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

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

qq_62784677的博客 215

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

qq_41586251的博客 2243

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

闻韶 3431

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

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

weixin_42464673的博客 266

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

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

weixin_50296259的博客 994

你的 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原类、类的创建过程与方法
下一篇: python上下文管理器细读
清风Python
博客等级 码龄7年 406粉丝 267原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值