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
。