Python 的 with 到底在管什么?拆开上下文管理器:__exit__ 返回值决定生死,异常从 yield 灌进去
结论先行:with 不是语法糖版的 try/finally——它把「资源生命周期」拆成了两次函数调用:__enter__ 拿资源、__exit__ 还资源,而 __exit__ 的返回值就是异常的生杀大权:返回 True,异常被当场吞掉;返回 False 或 None,异常原样穿透。更反直觉的是 @contextmanager 那一套:with 块里抛出的异常不是「被 except 抓到」,而是被 throw 进生成器、从 yield 那个点灌进去的。实测这套协议本身只要 353 纳...