所有文档告诉我们的是,
当用户点击中断键(通常为
Control-C
或Delete
)时引发。在执行期间,会定期检查中断。
但是从代码的角度来看,我什么时候可以看到这个异常?它是否在语句执行期间发生?仅在语句之间?它可以发生在表达式中间吗?
例如:
file_ = open('foo')
# <-- can a KeyboardInterrupt be raised here, after the successful
# completion of open but prior to the try? -->
try:
# try some things with file_
finally:
# cleanup
此代码会在适时的KeyboardInterrupt
期间泄漏吗?还是在某些语句或表达式的执行过程中引发?
根据不相关的 PEP 343 中的注释:
即使您编写了无错误的代码,键盘中断异常仍可能导致它在任意两个虚拟机操作码之间退出。
所以它基本上可以发生在任何地方。 它确实可能发生在计算单个表达式期间。 (这并不奇怪,因为表达式可以包含函数调用,并且函数调用中几乎任何事情都可能发生。
是的,KeyboardInterrupt
可能发生在您标记的地方。
要解决此问题,您应该使用with
块:
with open('foo') as file_:
# do some things
raise KeyboardInterrupt
# file resource is closed no matter what, even if a KeyboardInterrupt is raised
但是,即使在open()
调用和分配给file_
之间也可能发生异常。这可能不值得担心,因为通常ctrl-c意味着您的程序即将结束,因此操作系统将清理"泄漏"的文件句柄。但是,如果您知道它很重要,则可以使用信号处理程序来捕获引发键盘中断(SIGINT)的信号。