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.py
getargvalues()
呼び出し先の名前空間を取得する方法を知っている人はいますか?