※記事内に商品プロモーションを含むことがあります。
はじめに
Pythonで自作の例外(いわゆるエラー)を実装する場合、新たなクラスとして定義します。
Pythonのエラーは、構文エラーと例外に分けられます。この記事では後者を扱います。
検証環境:Python 3.9.7
例外の定義
自作の例外は以下のように定義します。
|
|
ここでは、Pythonに標準で組み込まれているException
(例外)クラスを継承して、MyError
という名前のクラスを定義しています。MyError
クラスの中身は必要ありません。なお、PEP 8では、例外の名前をCapWords方式(各単語の最初を大文字)で命名するように定められています。
例外の呼び出し
定義した例外を呼び出すには、raise
文を使用します。表示したいメッセージをMyError
クラスの括弧内に書きます。
|
|
実行結果
|
|
例外の処理
例外が発生してもプログラムの処理を続行したい場合、try
, except
文を使用します。try
節には例外が発生する可能性のある処理を書きます。また、except
の後に例外クラス名を指定します。その後の行に、例外発生時のみ実行したい処理を書きます。
|
|
実行結果
|
|
また、例外の内容を表示したい場合、except <例外クラス名> as <変数>
とします。例外が発生すると変数に例外オブジェクトが格納されます。変数名にはe
やerr
がよく使用されます。
|
|
実行結果
|
|
補足
例外クラスを定義しない場合
小規模なプログラムなどであえて例外クラスを定義したくない場合、Exception
クラスを使って例外を発生させることも可能です。
|
|
実行結果
|
|
ただし、Exception
クラスをそのまま使う場合、例外の処理に注意が必要です。try
, except
文でException
クラスを処理するとき、Exception
クラスを継承しているクラスも処理されてしまいます。Pythonの多くの例外はException
クラスを継承しているため、予期しない挙動が生じやすくなります。
以下の例では、ゼロ割り (ZeroDivisionError
) を発生させています。ZeroDivisionError
クラスはException
クラスを継承しています。
|
|
実行結果
|
|
例外の通知について
ユーザまたは他の関数などに例外を通知する場合、以下の実装方法があります。
- 例外クラスを実装する
- 数値(-1など)を返す
1.はこの記事で示した内容です。この場合、例外を無視するためには、呼び出し側がその処理を明示する必要があります。処理を書かない場合、例外が発生してプログラムが停止するため、安全側であると言えます。
一方、2. の実装では、例外が発生したときの停止処理を呼び出し側に書く必要があります。この停止処理は往々にして実装を忘れがちであり、意図しない状態でプログラムが動き続けることになります。
そのため、基本的に1. の実装が望ましいです。ただし、呼び出し側がPython以外のプログラムである等、標準入出力を介してしか情報を受け取れないような状況では、数値で返さざるを得ないこともあります。