Pythonで例外が発生した場合、スタックを検査できますか?その深さを判断できますか?トレースバックモジュールを見てきましたが、使い方がわかりません。
私の目標は、eval式の解析中に発生する例外をキャッチすることであり、呼び出された可能性のある関数によってスローされる例外をキャッチすることはありません。evalを使用したことで私を怒らせないでください。それは私の決断ではありませんでした。
注:これは、インタラクティブではなく、プログラムで実行したいと思います。
Pythonで例外が発生した場合、スタックを検査できますか?その深さを判断できますか?トレースバックモジュールを見てきましたが、使い方がわかりません。
私の目標は、eval式の解析中に発生する例外をキャッチすることであり、呼び出された可能性のある関数によってスローされる例外をキャッチすることはありません。evalを使用したことで私を怒らせないでください。それは私の決断ではありませんでした。
注:これは、インタラクティブではなく、プログラムで実行したいと思います。
traceback
十分です-そして私はドキュメントがそれをかなりよく説明していると思います。簡略化した例:
import sys
import traceback
try:
eval('a')
except NameError:
traceback.print_exc(file=sys.stdout)
トレース用のユーティリティ機能を備えた検査モジュールを使用できます。フレームオブジェクトのプロパティの概要をご覧ください。
トレースバックモジュールが好きです。
を使用してトレースバックオブジェクトを取得できますsys.exc_info()
。次に、そのオブジェクトを使用して、を使用してトレースバックエントリのリスト前処理済みリストを取得できますtraceback.extract_tb()
。traceback.format_list()
次に、次のように使用して読み取り可能なリストを取得できます。
import sys
import traceback, inspect
try:
f = open("nonExistant file",'r')
except:
(exc_type, exc_value, exc_traceback) = sys.exc_info()
#print exception type
print exc_type
tb_list = traceback.extract_tb(sys.exc_info()[2])
tb_list = traceback.format_list(tb_list)
for elt in tb_list:
print elt
#Do any processing you need here.
sysモジュールを参照してください:http://docs.python.org/library/sys.html
およびトレースバックモジュール:http ://docs.python.org/library/traceback.html
あなたはそのような関数を定義します(ここのドキュメント):
def raiseErr():
for f in inspect.stack(): print '-', inspect.getframeinfo(f[0])
モジュールから呼び出すので、次のようになります。
raiseErr()
関数raiseErrは、呼び出した場所に関する情報を出力します。
より精巧に、あなたはそうすることができます:
import inspect, traceback
A = [inspect.getframeinfo(f[0]) for f in inspect.stack()]
print "traceback structure fields:", filter(lambda s: s[0] != '_', dir(A[0]))
print A[0].filename, A[0].lineno
for f in inspect.stack():
F = inspect.getframeinfo(f[0])
print '-', F.filename, F.lineno, '\t', F.code_context[0].strip()
他の可能性は、この関数を定義することです。
def tr():
print '* - '*10,
print sys._getframe(1).f_code.co_name
そして、あなたがトレースしたい場所でそれを呼び出します。すべてのトレースが必要な場合は、で1から上のイテレータを作成します_getframe(1)
。
AndiDogの回答に加えて、スタックを上下に移動して、地元の人などを調べることができることinspect
に注意してください。pdb
標準ライブラリのソースは、そのpdb.py
ようなことを行う方法を学ぶのに役立つかもしれません。