所有文档告诉我们的是:
当用户按下中断键(通常为
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
时会泄露吗?还是在执行某些语句或表达式时引发它?
with
并不总是可行的;有时您想要在调用__enter__
之前查看with
语句中的表达式是否失败(例如,它是否引发了特定的异常?)。您无法使用with
来实现此目的,因为这会使您失去包装表达式而不包装with
体的能力。(如果with
体可以引发与with
表达式相同类型的异常,则意味着您无法在except
中区分它们。) - Thanatos