6

スタックの奥深くで例外を生成できるコードを書いています。これらの例外をキャッチし、エラー処理モジュールによる処理のためにそれらを送信する最上部に近いレイヤーがあります。私が望むのは、エラー処理モジュールがスタック トレースをエラー ログに出力できるようにすることですが、これを行う方法を理解するのは難しいと感じています。

背景に関する注意事項:

  • コードはマルチスレッド化されているため、sys.last_traceback の動作については確信が持てません。

  • 例外自体のコンストラクターでスタックをキャプチャしようとしました。sys.last_traceback は、この場合は None になることがあり (未処理の例外の場合にのみ存在するため)、常に正しいとは限りません。私は現在、使用していじっています

    self.stack = traceback.format_stack()[:-2]

例外のコンストラクターで、これは情報に関しては有望に見えますが、それを行う「正しい」方法のようには感じません

  • 私が見つけたこれを行う方法のすべての例は、後のエラー処理モジュールではなく、except ブロックにスタック トレースを出力する方法を示しています。(たとえば、Python コードのメソッドから現在の呼び出し履歴を出力する を参照してください)

  • Python ドキュメント ( http://docs.python.org/library/traceback.html ) でtraceback モジュールをマイニングしましたが、これが私が望むことを行うかどうかを判断できませんでした。sys.last_traceback から取得する可能性があるため、トレースバックのフォーマットに主に関係しているようです。使用例がいくつかありますが、私がやろうとしていることと一致するものはありません。

これをやりたいと思ったのは私が初めてだとは思わないので、何かが欠けているに違いありません。正しい方向へのポインタは大歓迎です。

4

3 に答える 3

2

例外処理の最初の行は次のようになります。

exc_type, exc_value, exc_traceback = sys.exc_info()

これらの変数を保存するか、好きなように渡してから、後でトレースバックモジュールを使用して表示することができます。

于 2012-04-11T11:46:11.930 に答える
0

保護したい関数にデコレータを追加するのはどうですか? 例えば:

@onerrorignore
def foo(a, b, c):
    ...

デコレータは次のようになります。

def onerrorignore(f):
    def _f(*args, **kwargs):
        try:
            ret = f()
        except:
            error_handler.handle(sys.exc_info())
        else:
            return ret
    return _f
于 2012-04-11T13:23:59.963 に答える
0

私があなたを正しく理解していれば、スタックトレースを保持しながら例外を再スローしたいですか? したがって、次のような呼び出し階層があります。

error_handling_module # you want to print the stacktrace here
|
something_else
|
module_excepting_and_rethrowing
|
something_else
|
module_raising_an_error

あなたのmodule_excepting_and_rethrowingでは、次のことができます:

except Exception:
   exc_type, exc_value, exc_traceback = sys.exc_info()
   raise NewException, exc_value, exc_traceback

Python3 では、次のこともできます。

 except Exception as e:
     raise NewException from e
于 2012-04-11T13:38:06.147 に答える