章节摘要:程序与外部世界打交道就两件事——搬数据(文件 IO)与处理失敗(异常)。本章把 with 语句还原为
__enter__/__exit__协议,把异常还原为"携带栈帧的对象沿调用链上抛",再给出分类处理、自定义异常与清理动作的工程范式。
阅读完本章,你应当能够:
with 的承诺只有一句话:无论体 内发生什么,退出路径必被调用。资源安全靠协议,不靠自觉。
文本/二进制模式、编码显式化、逐行处理大文件、路径对象 pathlib,以及自定义上下文管理器。
异常对象与调用栈、try/except/else/finally 语义、异常链与再抛出、自定义异常设计。
6.1 的 with 是 6.2 异常机制的第一个应用场景:资源清理本质上就是"异常路径上的收尾动作"。先讲应用再讲原理,回头看 with 协议里的 __exit__ 参数就完全透明了。
前置:第 2 章 bytes 与 str、第 4 章魔术方法。
本章的现实检验方式很简单:翻出你以前写的任何一个"打开文件却不关、异常裸 except"的旧脚本,用 with 与分类捕获重写一遍。改完对比两版的行数不会差太多,但一版在异常路径上布满地雷,另一版在每条退出路径上都有收尾——这就是机制理解与语法记忆的差距。
为后续铺垫:第 7 章生成器版的上下文管理器、第 8 章异步 IO 与取消异常、第 9 章网络请求的超时重试都大量使用本章范式。