1

以下のサンプル コードでは、装飾された関数の呼び出し先のスタック フレームを取得するつもりです。装飾された関数 power(below) が pwr 関数を呼び出し、例外があり、pwr のスタック フレーム (関数の引数を出力するため) を取得したいとします。APIで公開されている関数については、その引数と応答が出力されますが、モジュールの内部にある関数とAPIが呼び出す関数については、それらのスタックフレームを取得したいと思います.

import inspect
def api(func):
    def decor(*args, **kwargs):
        try:
            print "Request %s %s %s" % ( func.__name__, args, kwargs)
            response = func(*args,**kwargs)
            print "response %s", response
            return response
        except Exception, e:
            print "exception in %s", func.__name__
            for frame in inspect.stack():
                print frame[3]
            raise e
    return decor

@api
def power(a,b):
    return pwr(a,b)

def pwr():
   ...
   ...

コードを実行すると、例外中に装飾からスタック フレームが取得されますが、func またはそれ以下では取得されません。誰でも提案できますか?

4

2 に答える 2

2

If you want to look at the context in which the exception occurred, you need to look at the third value (the "traceback object") returned from sys.exc_info(). The traceback module has some useful functions for handling these objects: you might be able to make use of traceback.print_tb.

For example:

>>> import sys, traceback
>>> try: raise Exception()
... except: traceback.print_tb(sys.exc_info()[2])
... 
  File "<stdin>", line 1, in <module>
于 2013-04-04T11:34:48.443 に答える
0

フレームが単に存在しないため、関数が返された、または呼び出された後、例外が発生した後、フレームにアクセスすることはできません。デバッグ/プロファイリングの目的で関数フレームに本当にアクセスしたいが、関数を変更できない場合は、sys.setprofileまたはの使用を検討してsys.settraceください。コールバックにはフレームが引数として渡されます。

于 2013-04-04T10:35:36.163 に答える