Pythonで自作の例外を作ってraiseとか終了処理を行う方法

スポンサーリンク

Exceptionは、エラーが発生したときに発生し、プログラムに何か問題があったことを示します。

デフォルトでは、間違った型が渡されたときの TypeError のように、言語が定義してくれる例外がたくさんあります。

この記事では、Pythonで独自のカスタム例外を作成する方法について見ていきます。

しかし、カスタム例外がどのように実装されているかを見る前に、Pythonでどのように異なるタイプの例外を発生させることができるかを見てみましょう。

スポンサーリンク

Raise Exceptions

Python では、プログラマは raise キーワードを使用して手動で Exception を発生させることができます。

書式は以下の通りです。

以下の関数は、関数に渡された入力によって異なる例外を発生させます。

def exception_raiser(string):
    if isinstance(string, int):
        raise ValueError
    elif isinstance(string, str):
        raise IndexError
    else:
        raise TypeError

結果は以下の通りです。

出力:

>>> exception_raiser(123)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in exception_raiser
ValueError
>>> exception_raiser('abc')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in exception_raiser
IndexError
>>> exception_raiser([123, 456])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in exception_raiser
TypeError

ご覧の通り、プログラマが選択した入力に応じて、異なるタイプの例外が発生します。

これは、例外が発生する理由を積極的に予測することができるので、エラー処理の柔軟性にも優れています。

カスタム例外の定義

同様に、Pythonでは独自のカスタムExceptionを定義することも可能です。

このExceptionが何をできるか、そしていつ発生させるかは、 raise キーワードを使って完全にコントロールすることができます

では、どのようにカスタムExceptionを定義し、実装するか見てみましょう。

1. カスタム Exception クラスの作成

新しいExceptionを定義するために、カスタムのExceptionクラスを作成することができます

繰り返しますが、クラスを使用する背景には、Pythonがすべてをクラスとして扱うという考え方があります。

ですから、Exceptionがクラスであることはそれほど突飛なことではないように思えます。

すべてのExceptionは親クラスである Exception を継承しています。

このクラスは、渡された入力がリストで、そのリストの要素数が奇数である場合にのみ Exception を発生させるクラスです。

class MyException(Exception):
    pass
 
def list_check(lst):
    if len(lst) % 2 != 0:
        raise MyException
 
# MyException will not be raised
list_check([1, 2, 3, 4])
 
# MyException will be raised
list_check([1, 3, 5])   

結果は以下の通りです。

root@Python:~# python3 exceptions.py
Traceback (most recent call last):
  File "exceptions.py", line 12, in <module>
    list_check([1, 3, 5])
  File "exceptions.py", line 6, in list_check
    raise MyException
__main__.MyException

2. カスタムメッセージとエラーの追加

カスタム例外に対して、独自のエラーメッセージを追加し、コンソールに表示することができます

これには、 MyException クラスの messageerror という二つのパラメータを使います。

では、元のコードを修正して、カスタム例外のメッセージとエラーを指定してみましょう。

class MyException(Exception):
    def __init__(self, message, errors):
        # Call Exception.__init__(message)
        # to use the same Message header as the parent class
        super().__init__(message)
        self.errors = errors
        # Display the errors
        print('Printing Errors:')
        print(errors)
 
def list_check(lst):
    if len(lst) % 2 != 0:
        raise MyException('Custom Message', 'Custom Error')
 
# MyException will not be raised
list_check([1, 2, 3, 4])
 
# MyException will be raised
list_check([1, 3, 5])

結果は以下の通りです。

出力:

Printing Errors:
Custom Error
Traceback (most recent call last):
  File "exceptions.py", line 17, in <module>
    list_check([1, 3, 5])
  File "exceptions.py", line 11, in list_check
    raise MyException('Custom Message', 'Custom Error')
main.MyException: Custom Message

このようにして、デバッグ用のカスタムエラーメッセージを含む独自の Custom Exception を実装することに成功しました! これは、ライブラリ/APIを構築しているときに、他のプログラマがカスタムExceptionが発生したときに何が悪かったのかを正確に知りたい場合に、非常に便利です。

まとめ

この記事では、raiseキーワードを使用して例外を発生させる方法と、クラスを使用して独自の例外を構築し、例外にエラーメッセージを追加する方法を学びました。

タイトルとURLをコピーしました