千家信息网

python中with和异常处理实例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇"python中with和异常处理实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看
千家信息网最后更新 2026年11月02日python中with和异常处理实例分析

这篇"python中with和异常处理实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"python中with和异常处理实例分析"文章吧。

在长时间的编程开发中,你肯定见过或者使用过下面这段代码:

with open("test.txt", "r", encoding="utf-8") as f:    s = f.readlines()

有些人会知道这么写的原因,但是更多的人不知道原因。只是觉得别人都这么写,那我也跟着写。

同时,很多知道原因的人也只是知其然而不知其所以然:with 语句可以替我们自动关闭打开的文件对象。但是这是通过什么机制办到的呢?

1. with和异常处理

我们知道,如果不使用with语句的话,正常地读写一个文件应该经过这些过程:打开文件、操作文件、关闭文件。表达为 Python 代码如下:

f = open("test.txt", "r", encoding="utf-8")s = f.readlines()f.close()

在正常情况下,这样写看起来也没啥问题。

接下来我们就人为制造一点"意外":把打开文件对象时指定的模式由"r"改为"w"。

f = open("test.txt", "w", encoding="utf-8")s = f.readlines()f.close()

此时,当程序执行到第2行读取文件内容时,就会抛出错误:

Traceback (most recent call last):  File "test_with.py", line 2, in     s = f.readlines()io.UnsupportedOperation: not readable

然后……一个可怕的情况就发生了。

Python 产生未处理的异常从而退出了,导致第2行之后的代码尚未执行,因此f.close()也就再也没有机会执行。一个孤魂野鬼般打开的文件对象就这样一个人漂泊在内存的汪洋大海中,没有人知道他是谁、他从哪儿来、他要去哪儿。

就这样,每当抛出一次异常,就会产生这么一个流浪对象。久而久之,内存的汪洋大海也就顺理成章被改造成了流浪者的乐土,其他人想来压根儿没门儿。

追根究底,我们发现导致这个问题的关键在于"打开-操作-关闭"文件这个流水操作中,存在抛出异常的可能。

所以我们想到了使用 Python 为我们提供的大杀器,来对付这些异常:try-catch。

用异常处理改造一下前面的代码:

try:    f = open("test.txt", "a", encoding="utf-8")    s = f.readlines()except:    print("出现异常")finally:    f.close()

这样一来,通过附加的finally语句,无论文件操作是否抛出异常,都能够保证打开的文件被关闭。从而避免了不断占用资源导致资源泄露的问题。

实际上,with 语句正是为我们提供了一种try-catch-finally的封装。

编程时,看似只是随随便便的一个 with ,其实已经暗地里确保了类似于上面代码的异常处理机制。

2. 上下文管理器

with 要生效,需要作用于一个上下文管理器--

打住,到底什么是上下文管理器呢?

长话短说,就是实现了__enter__和__exit__方法的对象。

在进入一个运行时上下文前,会先加载这两个方法以备使用。进入这个运行时上下文时,调用__enter__方法;退出该上下文前,则会调用__exit__方法。

这里的"运行时上下文",可以简单地理解为一个提供了某些特殊配置的代码作用域。

当我们使用with open("test.txt", "r", encoding="utf-8") as f这句代码时,Python首先对open("test.txt", "r", encoding="utf-8")求值,得到一个上下文管理器。

这里有一点特殊的是,Python中文件对象本身就是一个上下文管理器,因此我们可以使用open函数作为求值的表达式。

随后调用__enter__方法,返回的对象绑定到我们指定的标识符f上。文件对象的__enter__返回文件对象自身,因此这句代码就是将打开的"test.txt"文件对象绑定到了标识符f上。

紧跟着执行 with 语句块中的内容。

最后调用__exit__,退出 with 语句块。

根据上面的内容,我们也可以自行构造一个上下文管理器(注意,两个特征方法的参数要与协议一致):

class testContextManager:    def __enter__(self):        print("进入运行时上下文,调用__enter__方法")    def __exit__(self, exc_type, exc_value, traceback):        print("退出运行时上下文,调用__exit__方法")with testContextManager() as o:    pass

输出结果:

进入运行时上下文,调用__enter__方法退出运行时上下文,调用__exit__方法

with 语句之所以能够替代繁琐的异常处理语句,正是由于上下文管理器遵循协议实现了__enter__和__exit__方法,而with语句又确保了发生异常时能够执行完__exit__方法,再退出相关运行时上下文。

在这个方法中,我们就可以完成一些必要的清理工作。

以上就是关于"python中with和异常处理实例分析"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

上下 上下文 文件 方法 对象 语句 处理 代码 内容 运行 管理 utf-8 就是 实例 实例分析 分析 原因 只是 问题 特殊 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网高科技 百单网互联网科技有限公司怎么样 广东万易互联网科技有限公司惠州分公司 科技与互联网 科技互联网技术 金融科技 互联网金融 互联网科技公司官网 壹账通互联网科技 善班互联网科技有限公司 菲比寻常互联网科技 新华互联网科技2019 中国互联网有什么科技含量 宁夏众和广鑫互联网科技有限公司 宝灵互联网科技有限公司 杭州壁岐互联网科技有限公司 消费医药和互联网科技 华中科技大学互联网的牛人 工业互联网山东科技大学 半导体是互联网高科技吗 广州互联网高科技取餐柜 互联网科技公司华为 互联网和科技创新 网络科技有限互联网 壕鑫互联网络科技 米聚互联网科技南京有限公司排面 佛山市翊博互联网络科技有限公司 伍佰万互联网科技怎么赚钱 张家口科技产业互联网平台 第三届互联网大会安防黑科技 科技发展第三阶段互联网时代
0