Exceptionは、エラーが発生したときに発生し、プログラムに何か問題があったことを示します。
デフォルトでは、間違った型が渡されたときの TypeError のように、言語が定義してくれる例外がたくさんあります。
この記事では、Pythonで独自のカスタム例外を作成する方法について見ていきます。
しかし、カスタム例外がどのように実装されているかを見る前に、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を定義し、実装するか見てみましょう。
この記事もチェック:Pythonでの変数の定義やスコープ、削除、globalキーワードを解説していく
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 raisedlist_check([1, 2, 3, 4])
# MyException will be raisedlist_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 クラスの message と error という二つのパラメータを使います。
では、元のコードを修正して、カスタム例外のメッセージとエラーを指定してみましょう。
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 raisedlist_check([1, 2, 3, 4])
# MyException will be raisedlist_check([1, 3, 5])
|
結果は以下の通りです。
出力:
Printing Errors:Custom ErrorTraceback (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キーワードを使用して例外を発生させる方法と、クラスを使用して独自の例外を構築し、例外にエラーメッセージを追加する方法を学びました。