2009-07-27 10 views
3

Python(2.6)で、スタックのどこかで例外処理コードから呼び出されているかどうかを判断できる関数を記述したいと思います。Pythonでは、例外処理コードによって呼び出されるかどうかを知る方法は?

これは、特殊なログ用です。 Pythonのloggingモジュールでは、呼び出し側が例外情報をログに記録するように明示的に指定する必要があります(logger.exception()を呼び出すか、exc_infoキーワードを使用して呼び出す)。私は、ロガーが例外処理コード内から呼び出されているかどうかに基づいて自動的にこれを行うようにしたいと思います。

私はsys.exc_info()のチェックが答えかもしれないと考えましたが、すでに処理されている例外から例外情報も返します。 (docsから: "この関数は、現在処理されている例外に関する情報を与える3つの値のタプルを返します。現在のスタックフレームが例外を処理していない場合、情報は呼び出し元のスタックフレームから取得されます。呼び出し元などのスタックフレームが発見されるまで、その例外を処理している。ここで、「実行または句以外を実行した。」 ")

としても定義される「例外処理」、私はこれを呼び出し側に透過的にしたいので、節にexc_clear()または何かを使用する必要はありません。

これは正しい方法はありますか?

+0

どのように呼び出しコンテキストが曖昧になる可能性がありますか?例外**から呼び出される関数**を定義します。常に例外から呼び出されます。どうしたの?なぜ例外から呼び出されるように設計された関数が例外から呼び出されないのか、いくつかの感覚を提供してください。 –

+0

私はこれを例外から呼び出される関数として定義しませんでした。これは、例外から呼び出される可能性のある関数、または非例外から呼び出される可能性のある関数です。私はどちらが当てはまるかを判断したい。 –

+1

Ummm ...あなたの関数を定義するのに何が問題なのですか?**例外から呼び出さなければなりませんか?これを簡略化するために関数定義を変更できない原因は何ですか? –

答えて

2

例外ハンドラでsys.exc_clearを使用して例外をクリアすると、sys.exc_infoが有効です。あなたは次のスクリプトを実行する場合:たとえば

import sys 

try: 
    1/0 
except: 
    print sys.exc_info() 
    sys.exc_clear() 
print sys.exc_info() 

あなたはこの出力が表示されます。

 
(, ZeroDivisionError('integer division or modulo by zero',),) 
(None, None, None) 

アップデート:私は、単純な(「透明」)方法のがあると信じていません 「例外ハンドラは実行されていますか?いくつかのトラブルに行くことなく、私の意見では、単にログのトラブルを取る価値がない。もちろん、スタックフレームごとに(フレームオブジェクトのドキュメントを参照)、「例外が発生しましたか?」という質問に簡単に答えることができます。

+0

Vinayさん、ありがとうございますが、私はこれを行う方法を探しています。つまり、except節に特別なものは必要ありません。 より具体的に質問を編集します。 –

0

Pythonのすべてと同様、例外はオブジェクトです。したがって、処理された最後の例外への(weak!)参照を保持してからsys.exc_info()を使用することができます。 注:マルチスレッドコードの場合、この方法に問題がある可能性があります。他にもコーナーケースがあるかもしれません。

ただし、explicit is better than implicit本当にあなたのシステムに追加するには、通常の場合と同じように例外ログを記録するのがよいでしょうか?
私の謙虚な意見ではなく、

関連する問題