不幸的是,异步异常处理是不可靠的(由信号处理程序引发的异常、通过C API的外部上下文等)。如果代码中有一些关于捕获异步异常的协调,您可以增加正确处理异步异常的机会(除了非常关键的函数之外,调用堆栈中可能的最高值似乎是合适的)。
被调用的函数(dostuff)或堆栈后面的函数本身可能有一个catch for KeyboardInterrupt或BaseException,而您没有/无法解释这个catch。
对于Python2.6.6(x64)interactive+Windows7(64位),这个简单的例子工作得很好:>>> import time
>>> def foo():
... try:
... time.sleep(100)
... except KeyboardInterrupt:
... print "INTERRUPTED!"
...
>>> foo()
INTERRUPTED! #after pressing ctrl+c
编辑:
经过进一步调查,我尝试了我认为是其他人用来重现这个问题的例子。我很懒,所以我把“最后”这个词漏掉了>>> def foo():
... try:
... sys.stdin.read()
... except KeyboardInterrupt:
... print "BLAH"
...
>>> foo()
这在按下CTRL+C后立即返回。当我立即再次尝试调用foo时发生了有趣的事情:>>> foo()
<