前に作成した「Pythonで独自の例外エラーを発生させる方法」で例外エラーが発生したファイルとその行番号がわかればデバッグ時や障害発生時に解決の手助けになるなぁと思い調べてみるとできることが判明したので、独自例外エラー発生処理に追加してみます。
Pythonで独自の例外エラーを発生させる方法
Pythonで例外エラーが発生した際に独自のエラーメッセージを付加して表示させるための拡張クラス(子クラス)です。基底クラス(親クラス)はExceptionクラスを指定して作成します。
Pythonで例外が発生したファイル名と行番号を取得する
Pythonで例外が発生したファイル名と行番号を取得するにはsys.exc_info() で返される情報に現在の行番号(tb_lineno )が設定されています。
参考にさせていただいたのは以下の記事です。
Python で例外が発生した場所を取得する – 北風研究室
早速、この記事の内容を独自エラーに組み込んでみます。
import sys import os class myException( Exception ): def __init__( self, e, message ): exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split( exc_tb.tb_frame.f_code.co_filename )[ 1 ] raise type( e )( str( sys.exc_info()[1] ) + ' : [' + str( fname ) + '][' + str( exc_tb.tb_lineno ) + ']' + message ) ########################## #独自例外エラークラス生成 ########################## 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')
組み込んだのは
exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split( exc_tb.tb_frame.f_code.co_filename )[ 1 ]
の2行です。
これを実行すると
Unexpected error: <class 'ZeroDivisionError'> Unexpected error: division by zero : [main.py][16]sub_func() 0で割ってはいけません。[x=1/0] Unexpected error: <traceback object at 0x000002586ECA3808> finally
となり、ちゃんと例外エラーが発生したファイル名と行数が出力されています。
まとめ
Pythonで例外が発生したファイル名と行番号を取得するにはsys.exc_info()を利用すれば取得することができます。