В Python есть собственный встроенный обработчик для SIGINT
. Этот обработчик просто вызывает KeyboardInterrupt
. В вашем первом коде вы заменили встроенный обработчик новым обработчиком, поэтому вы видите этот вывод:
$python test_exc.py
^Cinterrupted
Обратите внимание, что io interrupted
не печатается, так как исключений не возникало. Фактически изменение кода на:
import signal,sys
def handleInt(sign,no):
print "interrupted"
signal.signal(signal.SIGINT, handleInt) # exception raised is IOError
try:
sys.stdin.read(1)
except IOError:
print "io interrupt"
else:
# else is executed only if no exception was raised
print "done"
Вы получаете:
$python test_exc.py
^Cinterrupted
done
Обратите внимание, что нажатие Ctrl+C
не блокирует вызов sys.stdin.read(1)
, поэтому вам все равно нужно нажать какую-нибудь клавишу, чтобы программа продолжила работу. Вызов исключения внутри обработчика сигнала приведет к его возникновению, как если бы оно было вызвано вызовом sys.stdin.read(1)
:
import signal,sys
def handleInt(sign,no):
print "interrupted"
raise OSError
signal.signal(signal.SIGINT, handleInt) # exception raised is IOError
try:
sys.stdin.read(1)
except IOError:
print "io interrupt"
else:
# else is executed only if no exception was raised
print "done"
Пример запуска:
$python test_exc.py
^Cinterrupted
Traceback (most recent call last):
File "test_exc.py", line 10, in <module>
sys.stdin.read(1)
File "test_exc.py", line 5, in handleInt
raise OSError
OSError
Примечание: вы можете получить доступ к обработчику сигналов по умолчанию через signal.default_int_handler
.
person
Bakuriu
schedule
26.07.2013