JavaScriptを有効にしてください

Pythonで例外(エラー)クラスを自作する

 ·   4 min read

※記事内に商品プロモーションを含むことがあります。

はじめに

Pythonで自作の例外(いわゆるエラー)を実装する場合、新たなクラスとして定義します。

Pythonのエラーは、構文エラーと例外に分けられます。この記事では後者を扱います。

検証環境:Python 3.9.7

例外の定義

自作の例外は以下のように定義します。

1
2
class MyError(Exception):
    pass

ここでは、Pythonに標準で組み込まれているException(例外)クラスを継承して、MyErrorという名前のクラスを定義しています。MyErrorクラスの中身は必要ありません。なお、PEP 8では、例外の名前をCapWords方式(各単語の最初を大文字)で命名するように定められています。

例外の呼び出し

定義した例外を呼び出すには、raise文を使用します。表示したいメッセージをMyErrorクラスの括弧内に書きます。

1
raise MyError('ここにエラーの内容を書きます。')

実行結果

1
2
3
4
5
6
Traceback (most recent call last):

  File "C:\Users\XXX\AppData\Local\Temp/ipykernel_12704/1498351757.py", line 1, in <module>
    raise MyError('ここにエラーの内容を書きます。')

MyError: ここにエラーの内容を書きます。

例外の処理

例外が発生してもプログラムの処理を続行したい場合、try, except文を使用します。try節には例外が発生する可能性のある処理を書きます。また、exceptの後に例外クラス名を指定します。その後の行に、例外発生時のみ実行したい処理を書きます。

1
2
3
4
try:
    raise MyError("例外メッセージ")
except MyError:
    print("except節は実行されます。")

実行結果

1
except節は実行されます

また、例外の内容を表示したい場合、except <例外クラス名> as <変数>とします。例外が発生すると変数に例外オブジェクトが格納されます。変数名にはeerrがよく使用されます。

1
2
3
4
try:
    raise MyError("例外メッセージ")
except MyError as e:
    print(e)

実行結果

1
例外メッセージ

補足

例外クラスを定義しない場合

小規模なプログラムなどであえて例外クラスを定義したくない場合、Exceptionクラスを使って例外を発生させることも可能です。

1
raise Exception("例外の基底クラス")

実行結果

1
2
3
4
5
6
Traceback (most recent call last):

  File "C:\Users\XXX\AppData\Local\Temp/ipykernel_16000/2783862629.py", line 1, in <module>
    raise Exception("例外の基底クラス")

Exception: 例外の基底クラス

ただし、Exceptionクラスをそのまま使う場合、例外の処理に注意が必要です。try, except文でExceptionクラスを処理するとき、Exceptionクラスを継承しているクラスも処理されてしまいます。Pythonの多くの例外はExceptionクラスを継承しているため、予期しない挙動が生じやすくなります。

以下の例では、ゼロ割り (ZeroDivisionError) を発生させています。ZeroDivisionErrorクラスはExceptionクラスを継承しています。

1
2
3
4
try:
    1/0
except Exception:
    print("ZeroDivisionErrorも処理されてしまいます")

実行結果

1
ZeroDivisionErrorも処理されてしまいます

例外の通知について

ユーザまたは他の関数などに例外を通知する場合、以下の実装方法があります。

  1. 例外クラスを実装する
  2. 数値(-1など)を返す

1.はこの記事で示した内容です。この場合、例外を無視するためには、呼び出し側がその処理を明示する必要があります。処理を書かない場合、例外が発生してプログラムが停止するため、安全側であると言えます。

一方、2. の実装では、例外が発生したときの停止処理を呼び出し側に書く必要があります。この停止処理は往々にして実装を忘れがちであり、意図しない状態でプログラムが動き続けることになります。

そのため、基本的に1. の実装が望ましいです。ただし、呼び出し側がPython以外のプログラムである等、標準入出力を介してしか情報を受け取れないような状況では、数値で返さざるを得ないこともあります。

参考

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

サイト内検索