资源泄漏主因是异常跳过清理逻辑,应优先用with语句(含async with)确保__exit__或__aexit__在任何退出路径下执行,自定义类需正确实现且不误吞异常。
资源泄漏常发生在异常跳过 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免费学习笔记(深入)”;