Pythonでプログラミングを行っていると思わぬ箇所で例外エラーが発生したりします。
そんな例外エラーが発生した際に独自のエラーメッセージを表示させたかったので独自の例外エラークラスを作成してみました。
Pythonで独自の例外エラーを発生させる
Pythonでは標準で例外エラーが発生するとExceptionクラスの派生クラスをthrow(Pythonではraise)してくれます。
ただ、そのままの例外エラーではプログラム固有のメッセージを付加してエラー内容を表示するメソッドが公開されていないようなので、独自で例外エラークラスを定義してメッセージを付加してみました。
やり方としては既定クラス(親クラス)をExcptionとしたサブクラス(子クラス)を作成しました。
作成したのは以下のクラスです。
import sys class myException( Exception ): def __init__( self, e, message ): raise type( e )( str( sys.exc_info()[1] ) + ' : [' + __file__ + ']' + message )
実質は__init__()に1行書いただけで、渡されたエラークラスをraiseするタイミングで元のエラーメッセージに、独自のエラーメッセージを付加しているだけです。
(__file__は実行時のファイル名を表現しています。実験的に追加してます。)
呼び出す場合は、例外エラーをキャッチしたらmyExceptionクラスを元のエラークラスと付加したいメッセージを指定して生成するだけです。
def sub_func(): try: x= 1/0 except Exception as e: myException( e, 'sub_func() 0で割ってはいけません。[x=1/0]' ) try: sub_func() except: print("Unexpected error:", str(sys.exc_info()[0])) print("Unexpected error:", str(sys.exc_info()[1])) print("Unexpected error:", str(sys.exc_info()[2])) finally: print('finally')
これを実行すると
Unexpected error: <class 'ZeroDivisionError'> Unexpected error: division by zero : [main.py]sub_func() 0で割ってはいけません。[x=1/0] Unexpected error: <traceback object at 0x0000020443033388> finally
ということで元々のメッセージに付加した「[main.py]sub_func() 0で割ってはいけません。[x=1/0]」が付加されて表示されるようになります。
まとめ
例外クラスをちょっと一工夫するだけでプログラムのどこで起こったのかや、その時の引数などが出力できるようになり、トラブル解決の大きな手掛かりとなります。
以上、Pythonで独自の例外エラーを発生させる方法でした。