Я пишу Python 2.6.6 код на окнах выглядит следующим образом:Почему я не могу обрабатывать KeyboardInterrupt в python?
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:
и последующей печатью той же трассировки.
EDIT # 2: Если я добавлю что-нибудь после чтения, обработчик работает. Таким образом, это не удается:
try:
sys.stdin.read()
except KeyboardInterrupt:
...
Но это работает:
try:
sys.stdin.read()
print "Done reading."
except KeyboardInterrupt:
...
Вот что напечатано: "Совершено чтение"
Done reading. Interrupted!
cleaning up...
done.
Так, по какой-то причине, строка печатается, хотя исключение произошло в предыдущей строке. На самом деле это не проблема - очевидно, я должен иметь возможность обрабатывать исключение в любом месте блока «try». Однако печать не работает нормально - после этого она не печатает новую строку, как это предполагалось! «Прерванный» печатается на одной строке ... с пробелом перед ним, почему-то ...? Во всяком случае, после этого код делает то, что он должен.
Мне кажется, что это ошибка при обработке прерывания во время заблокированного системного вызова.
Показать код для вашего dostuff(), потому что этот код должен работать (и он делает) – user225312
Он работает как ожидается с Python 2.5.1. – khachik
, воспроизведенный с помощью Python 2.7, заменяя 'dostuff()' на 'sys.stdin.read()' – balpha