Pythonでエラーコードの詳細を取得する
最近何かと忙しいです・・・全然遊ぶ暇がなす。
さて、MayaでPythonを実行してエラーが起こると、だいたいエラーの箇所がわからないです。
作ったモジュールをインポートした時にSyntax Errorとかでたら、何処を探せばいいのやらで、虱潰しになってしまうことが多々あります。
エラーが起きたときのために、try/except仕込んでおいてエラーをプリントしようとしても、行数やモジュールの場所がわからなかったりと色々困ります。
そんなPython人を救ってくれるのが、tracebackモジュールとsysモジュールの模様。
をー、分かりやすくなった!
いえ、ホントはtext == 'Miss'だけ実行するぶんにはそのままでもエラーがわかるんですが、モジュールがからむととたんにわからなくなるんですよ!(あくまでMayaで実行した時の話です)
以下簡単な説明メモ。
■info = sys.exc_info()
この関数は、現在処理中の例外を示す三つの値のタプルを返します。(Pythonマニュアルより)
■tbinfo = traceback.format_tb( info[2] )
上記sys.exc_info()で取得したtracebackオブジェクトを格納すると、エラーの詳細を人が読みやすい形の文字列に整形したものをリストで返します。
traceback.extract_tb( info[2] )にすると、エラーの詳細を
(エラーの起こったファイル、行数、エラーの起こった関数、テキスト)
として4つの要素を持つタプルを、リストで返します。
format_tbの記述方式が気に食わないひとは、これら4つの要素から自作メッセージを作りましょうw
これでデバッグが楽になりますぞー!
さて、MayaでPythonを実行してエラーが起こると、だいたいエラーの箇所がわからないです。
作ったモジュールをインポートした時にSyntax Errorとかでたら、何処を探せばいいのやらで、虱潰しになってしまうことが多々あります。
エラーが起きたときのために、try/except仕込んでおいてエラーをプリントしようとしても、行数やモジュールの場所がわからなかったりと色々困ります。
そんなPython人を救ってくれるのが、tracebackモジュールとsysモジュールの模様。
import sys, traceback try: # エラーとなる行 text == 'Miss' except: # エラーの情報をsysモジュールから取得 info = sys.exc_info() # tracebackモジュールのformat_tbメソッドで特定の書式に変換 tbinfo = traceback.format_tb( info[2] ) # 収集した情報を読みやすいように整形して出力する---------------------------- print 'Python Error.'.ljust( 80, '=' ) for tbi in tbinfo: print tbi print ' %s' % str( info[1] ) print '\n'.rjust( 80, '=' ) # -----------------------------------------------------------------------------------上記スクリプトを実行すると以下のように表示されました。
Python Error.=================================================================== File "<maya console>", line 4, inname 'text' is not defined ===============================================================================
をー、分かりやすくなった!
いえ、ホントはtext == 'Miss'だけ実行するぶんにはそのままでもエラーがわかるんですが、モジュールがからむととたんにわからなくなるんですよ!(あくまでMayaで実行した時の話です)
以下簡単な説明メモ。
■info = sys.exc_info()
この関数は、現在処理中の例外を示す三つの値のタプルを返します。(Pythonマニュアルより)
- 一つ目がエラーのタイプ 例) <type 'exceptions.NameError'>
- 二つ目が起こったエラーの理由を示すテキストを持った例外オブジェクト 例)NameError("name 'text' is not defined",)
- 3つ目がtracebackオブジェクト
raise sys.exc_info()[1]としてやればエラーとしてフローを止めることができます。スバラシイ!
■tbinfo = traceback.format_tb( info[2] )
上記sys.exc_info()で取得したtracebackオブジェクトを格納すると、エラーの詳細を人が読みやすい形の文字列に整形したものをリストで返します。
traceback.extract_tb( info[2] )にすると、エラーの詳細を
(エラーの起こったファイル、行数、エラーの起こった関数、テキスト)
として4つの要素を持つタプルを、リストで返します。
format_tbの記述方式が気に食わないひとは、これら4つの要素から自作メッセージを作りましょうw
これでデバッグが楽になりますぞー!
スポンサーサイト