所有文档告诉我们的是,
当用户点击中断键(通常为
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
期间泄漏?或者是在执行某些语句或表达式时引发的?
答案 0 :(得分:5)
根据无关PEP 343中的说明:
即使你编写了无错误的代码,KeyboardInterrupt异常仍然会导致它在任何两个虚拟机操作码之间退出。
所以它基本上可以在任何地方发生。它确实可以在评估单个表达式时发生。 (这不应该是令人惊讶的,因为表达式可以包含函数调用,并且几乎任何事情都可以在函数调用中发生。)
答案 1 :(得分:2)
是的,您标记的地方可能会出现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 意味着你的程序即将结束,所以&#34;泄露&#34;文件句柄将由操作系统清理。但是如果你知道它很重要,你可以使用a signal handler来捕获引发KeyboardInterrupt(SIGINT)的信号。