通常使用with
语句打开文件,以避免文件句柄泄漏:
with open("myfile") as f:
…
但是如果异常出现在open
调用之间怎么办?在Python解释器中,open
函数很可能不是一个原子指令,因此完全有可能在系统调用已经完成之后,open
调用还没有完成时发生异步异常,比如KeyboardInterrupt
。
传统处理方式(例如在POSIX信号中)是使用掩蔽机制:在被掩蔽的情况下,异常的传递被暂停直到它们后来被取消掩蔽。这样可以实现类似于open
的操作具有原子性。Python中是否存在这样的原语呢?
[*] 有人可能会说对于KeyboardInterrupt
来说并不重要,因为程序即将死亡,但并非所有程序都是如此。一个程序可能选择在顶层上捕获KeyboardInterrupt
并继续执行,在这种情况下,泄漏的文件句柄可能随着时间的推移而增加。
open
要么成功,要么失败并整理好。你无需担心。 - David Heffernan