我在 Windows 上编写 python 2.6.6 代码,如下所示:
try:
dostuff()
except KeyboardInterrupt:
print "Interrupted!"
except:
print "Some other exception?"
finally:
print "cleaning up...."
print "done."
dostuff()
是一个永远循环的函数,从输入流中一次读取一行并对其进行操作。当我按下 ctrl-c 时,我希望能够停止它并进行清理。
相反,下面的代码except KeyboardInterrupt:
根本没有运行。唯一被打印的是“清理...”,然后会打印如下所示的回溯:
Traceback (most recent call last):
File "filename.py", line 119, in <module>
print 'cleaning up...'
KeyboardInterrupt
因此,异常处理代码没有运行,并且回溯声称在 finally 子句期间发生了 KeyboardInterrupt ,这没有意义,因为点击 ctrl-c 是导致该部分首先运行的原因!甚至通用except:
条款也没有运行。
编辑:根据评论,我try:
用 sys.stdin.read() 替换了块的内容。问题仍然完全按照描述发生,finally:
块的第一行运行,然后打印相同的回溯。
编辑#2: 如果我在读取后添加了很多东西,处理程序就会工作。所以,这失败了:
try:
sys.stdin.read()
except KeyboardInterrupt:
...
但这有效:
try:
sys.stdin.read()
print "Done reading."
except KeyboardInterrupt:
...
这是打印的内容:
Done reading. Interrupted!
cleaning up...
done.
所以,出于某种原因,“完成阅读”。行被打印,即使异常发生在前一行。这不是一个真正的问题——显然我必须能够在“try”块内的任何地方处理异常。但是,打印无法正常工作 - 之后它不会像预期的那样打印换行符!“Interrupted”打印在同一行......之前有一个空格,出于某种原因......?无论如何,在那之后代码会做它应该做的事情。
在我看来,这是在阻塞系统调用期间处理中断的错误。