Python で KeyboardInterrupt エラーをキャッチする

Vaibhhav Khetarpal 2023年10月10日
  1. try...except ステートメントを使用して Python の KeyboardInterrupt エラーをキャッチする
  2. Python でシグナルハンドラーを使用して KeyboardInterrupt エラーをキャッチする
Python で KeyboardInterrupt エラーをキャッチする

KeyboardInterrupt エラーは、ユーザーがCtrl + CCtrl + Zコマンドを使ったり、Jupyter Notebook の場合はカーネルに割り込んだりして、実行中のプログラムを手動で停止させようとしたときに発生します。しばしば発生する KeyboardInterrupt の意図しない使用を防ぐために、Python の例外処理を利用することができます。

このガイドでは、Python で KeyboardInterrupt エラーをキャッチする方法を学習します。

try...except ステートメントを使用して Python の KeyboardInterrupt エラーをキャッチする

try...except ステートメントは、Python での例外処理の目的で使用されます。try...except ステートメントには固有の構文があります。これは 3つのブロックに分割されており、Python コードではすべて異なる目的と機能を持っています。

  • try ブロックには、インタープリターがエラーをチェックする必要のあるコードのクラスターが含まれています。
  • except ブロックは、必要な例外を追加し、コードのエラーをバイパスするために使用されます。
  • finally ブロックには、チェックせずに実行し、try および except ブロックで無視する必要のあるステートメントが含まれています。

Python の KeyboardInterrupt のコードを説明するために、KeyboardInterrupt 例外を手動で処理しながらユーザーに入力を求める簡単なプログラムを取り上げます。

次のコードは、try...except ステートメントを使用して、Python の KeyboardInterrupt エラーをキャッチします。

try:
    x = input()
    print("Try using KeyboardInterrupt")
except KeyboardInterrupt:
    print("KeyboardInterrupt exception is caught")
else:
    print("No exceptions are caught")

上記のプログラムは、次の出力を提供します。

KeyboardInterrupt exception is caught

上記のコードでは、入力関数は try ブロックの間にあり、この場合は詳細が必要ないため、空のままになっています。次に、except ブロックが KeyboardInterrupt エラーを処理します。KeyboardInterrupt エラーは手動で発生するため、KeyboardInterrupt プロセスがいつ発生したかを識別できます。

Python では、ユーザーがコードのチャンクで必要な数の例外ブロックを定義できます。

Python でシグナルハンドラーを使用して KeyboardInterrupt エラーをキャッチする

signal モジュールは、Python でシグナルハンドラーを使用する関数とメカニズムを提供するために使用されます。基本的にキーボード Ctrl+C からの割り込みである SIGINT シグナルをキャッチできます。これが発生した場合、KeyboardInterrupt を上げることがデフォルトのアクションです。

Python の sys モジュールは、Python ランタイム環境の個別の部分を操作するために使用されるいくつかの必要な変数と関数を提供するために使用されます。

このメソッドをエラーなしで正常に使用するには、signal および sys モジュールを Python コードにインポートする必要があります。

次のコードは、シグナルハンドラーを使用して、Python の KeyboardInterrupt エラーをキャッチします。

import signal
import sys


def sigint_handler(signal, frame):
    print("KeyboardInterrupt is caught")
    sys.exit(0)


signal.signal(signal.SIGINT, sigint_handler)

上記のコードは次の出力を提供します。

KeyboardInterrupt is caught

上記のコードでは、signal.signal() 関数を使用して、特定のタイプのシグナルを受信したときに実行されるカスタムハンドラーを定義しています。

ハンドラーは、特定のシグナルに設定されると、ユーザーが手動でリセットするまでインストールされたままになることに注意してください。この場合、唯一の例外は SIGCHLD のハンドラーです。

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn