KeyboardInterrupt何时在Python中引发



所有文档告诉我们的是,

当用户点击中断键(通常为 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期间泄漏吗?还是在某些语句或表达式的执行过程中引发?

根据不相关的 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)的信号。

相关内容

  • 没有找到相关文章

最新更新