Я пишу код 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
Таким образом, код обработки исключений НЕ запускается, и трассировка утверждает, что KeyboardInterrupt произошел во время предложения finally, что не имеет смысла, потому что нажатие ctrl-c заставляет эту часть работать в первую очередь! Даже общее предложение except:
не работает.
EDIT: На основе комментариев я заменил содержимое блока 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". Однако печать не работает нормально - после этого она не печатает новую строку, как предполагалось! "Прерванный" печатается на одной строке... с пробелом перед ним, почему-то...? Во всяком случае, после этого код делает то, что он должен.
Мне кажется, что это ошибка при обработке прерывания во время заблокированного системного вызова.