Я пишу код Python 2.6.6 для Windows, который выглядит так:
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". Однако печать не работает нормально - после этого не печатается новая строка, как предполагалось! «Прервано» напечатано на той же строке... с пробелом перед ним, по какой-то причине...? Во всяком случае, после этого код делает то, что должен.
Мне кажется, что это баг обработки прерывания во время заблокированного системного вызова.
dostuff()
наsys.stdin.read()
- person balpha   schedule 05.01.2011dostuff()
наsys.stdin.read()
- person user225312   schedule 05.01.2011dostuff()
) в Python 2.7 в 64-разрядной версии Windows 7 и вижу точно такие же результаты, которые вы описываете. - person balpha   schedule 05.01.2011sys.stdout.flush()
послеprint "Interrupted!"
тоже ничего не изменила. - person Tim Pietzcker   schedule 05.01.2011dostuff()
наsys.stdin.readline()
? - person ChristopheD   schedule 05.01.2011