讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 资源泄漏与异常处理的关系

老墨小哥_4883

老墨小哥_4883

发布时间:2026-02-04 19:42:08

|

237人浏览过

|

来源于php中文网

原创

资源泄漏主因是异常跳过清理逻辑,应优先用with语句(含async with)确保__exit__或__aexit__在任何退出路径下执行,自定义类需正确实现且不误吞异常。

python 资源泄漏与异常处理的关系

资源泄漏常发生在异常跳过 cleanup 逻辑时

Python 中的资源泄漏(如文件未关闭、数据库连接未释放)多数不是因为忘了写 close(),而是因为异常在资源使用中途抛出,导致后续 cleanup 代码根本没机会执行。比如用 open() 打开文件后,在读取过程中触发 UnicodeDecodeError,若没做保护,file.close() 就会被跳过。

常见错误写法:

f = open('data.txt')
data = f.read()  # 这里可能抛异常
f.close()  # 永远不会执行
  • 任何手动调用 close()、disconnect()、release() 的地方,都面临同样风险
  • 即使加了 try/except,如果只捕获特定异常类型(如只捕 ValueError),其他异常仍会绕过清理
  • 多层嵌套资源(如文件 + 网络连接)会让手动管理逻辑迅速失控

用 with 语句替代裸 try/finally

with 不是语法糖,它背后调用的是对象的 __enter__ 和 __exit__ 方法,而 __exit__ 在**任何退出方式下都会被调用**——包括正常 return、break、continue,以及所有未被捕获或已捕获的异常。

正确做法:

立即学习“Python免费学习笔记(深入)”;

Browser Session Manager
Browser Session Manager

使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能

下载
with open('data.txt') as f:
    data = f.read()  # 即使这里抛异常,f.__exit__() 也会确保 close()
  • 标准库中支持 with 的类型:文件对象、threading.Lock、contextlib.closing 包裹的任意带 close() 的对象
  • 第三方库如 psycopg2(PostgreSQL)、requests.Session(部分版本)、sqlite3.Connection 都实现了上下文协议
  • 自定义类只需实现 __enter__ 和 __exit__,就能用 with 管理资源生命周期

自定义资源类必须正确处理 __exit__ 的返回值

__exit__(self, exc_type, exc_value, traceback) 的返回值决定异常是否继续向上抛出。返回 True 表示“已处理”,异常消失;返回 None 或 False 表示“未处理”,异常照常传播。大多数资源类不该吞掉异常。

典型错误:

def __exit__(self, *args):
    self.close()
    return True  # ❌ 吞掉所有异常,调用者完全不知道出错了
  • 除非你明确要压制异常(如日志记录后忽略),否则不要返回 True
  • 资源释放本身也可能失败(如网络连接 close 时超时),应在 __exit__ 内部用 try/except 包住 close(),避免干扰原异常传播
  • 若需在异常发生时执行额外逻辑(如回滚事务),应在 __exit__ 中检查 exc_type is not None,而不是靠返回值

异步代码中 async with 不能被普通 try/except 替代

在 async def 函数里,await 可能挂起并恢复多次,普通 try/finally 无法保证异步 cleanup 的原子性。比如 await db.acquire() 成功后,在 await db.query() 前被取消(CancelledError),手动 finally 块里的 await db.release() 可能因事件循环状态异常而失败。

  • 必须用 async with(对应 __aenter__/__aexit__)来管理异步资源
  • 常见支持类型:aiomysql.Pool、httpx.AsyncClient、aiofiles.open()
  • 不要在 async with 块内混用同步 I/O(如 time.sleep()),这会阻塞整个协程调度

实际项目中最容易被忽略的,是那些「看起来不重要」的资源:临时目录、内存映射文件、子进程句柄、甚至某些 C 扩展模块分配的内部缓冲区——它们不走 Python 的 GC 路径,一旦漏关,就只能靠进程退出强制回收。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1946

2025.08.19

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

3040

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

827

2025.10.24

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

827

2025.10.24

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4749

2023.11.02

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn