fc2ブログ

    Pythonでエラーコードの詳細を取得する

     最近何かと忙しいです・・・全然遊ぶ暇がなす。

     さて、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, in 
    
      name 'text' is not defined
    ===============================================================================

    をー、分かりやすくなった!
     いえ、ホントはtext == 'Miss'だけ実行するぶんにはそのままでもエラーがわかるんですが、モジュールがからむととたんにわからなくなるんですよ!(あくまでMayaで実行した時の話です)

     以下簡単な説明メモ。
    info = sys.exc_info()
     この関数は、現在処理中の例外を示す三つの値のタプルを返します。(Pythonマニュアルより)
    • 一つ目がエラーのタイプ
    •   例) <type 'exceptions.NameError'>
    • 二つ目が起こったエラーの理由を示すテキストを持った例外オブジェクト
    •   例)NameError("name 'text' is not defined",)
    • 3つ目がtracebackオブジェクト
    です。上記サンプルだと、except処理してるのでエラーは特に起こりません。しかし、エラーを明示したい場合はexceptの中で
    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


     これでデバッグが楽になりますぞー!

    スポンサーサイト



    コメントの投稿

    非公開コメント

    すごい!感動!やってみます!
    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココのメールアドレスからご連絡できますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR