0

Python コードの実行中に例外をインターセプトし、いくつかのレポートを作成したいと考えていました。主に、例外が発生したときにコードの名前空間をエクスポートしたかったのです。

私ができることは次のとおりです。

test.py例外を発生させるファイルがあります:

for i in range(10):
    if i > 5:
        j
    else:
        i

check.pyそして、テストスクリプトが引数として渡されたときに例外をインターセプトしてデバッガーを起動するファイル:

import sys, pdb

try:
    __import__(sys.argv[1])
except Exception as e:
    pdb.post_mortem(sys.exc_info()[2])

それはすばらしい。

inspectさらに、モジュールを使用して、例外が発生した呼び出し先のフレームを見つけることができます。

import sys, inspect

try:
    __import__(sys.argv[1])
except Exception as e:
    callee_frame_tuple = inspect.trace()[1]
    print callee_frame_tuple

出力:

(<frame object at 0x00C9B260>, 'C:\\Temp\\test.py', 3, '<module>', ['        j\n'], 0)

それを使用して、フレームに関する情報を取得しますgetargvalues()

import sys, inspect

try:
    __import__(sys.argv[1])
except Exception as e:
    callee_frame_tuple = inspect.trace()[1]
    inspect.getargvalues(callee_named_tuple[0])[3]['__builtins__']['locals']()

出力:

{'__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__file__': 'C:\\Temp\\check.py',
 '__name__': '__main__',
 '__package__': None,
 'e': NameError("name 'j' is not defined",),
 'inspect': <module 'inspect' from 'C:\Python27\lib\inspect.pyc'>,
 'sys': <module 'sys' (built-in)>}

そのため、フレーム参照を引数として使用しましたがcheck.py、呼び出し先ではなくローカルを取得しました。test.pygetargvalues()

呼び出し先の名前空間を取得する方法を知っている人はいますか?

4

1 に答える 1