什么是在Python中引发KeyboardInterrupt?

时间:2016-02-23 07:36:56

标签: python exception exception-handling keyboardinterrupt

所有文档告诉我们的是,

  

当用户点击中断键(通常为Control-CDelete)时触发。在执行期间,定期检查中断。

但是从代码的角度来看,什么时候可以看到这个异常?在语句执行期间是否会发生?只有在陈述之间?它可以发生在表达式的中间吗?

例如:

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期间泄漏?或者是在执行某些语句或表达式时引发的?

2 个答案:

答案 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)的信号。