20

Pythonで例外が発生した場合、スタックを検査できますか?その深さを判断できますか?トレースバックモジュールを見てきましたが、使い方がわかりません。

私の目標は、eval式の解析中に発生する例外をキャッチすることであり、呼び出された可能性のある関数によってスローされる例外をキャッチすることはありません。evalを使用したことで私を怒らせないでください。それは私の決断ではありませんでした。

注:これは、インタラクティブではなく、プログラムで実行したいと思います。

4

5 に答える 5

15

traceback十分です-そして私はドキュメントがそれをかなりよく説明していると思います。簡略化した例:

import sys
import traceback

try:
    eval('a')
except NameError:
    traceback.print_exc(file=sys.stdout)
于 2010-03-01T22:20:14.337 に答える
6

トレース用のユーティリティ機能を備えた検査モジュールを使用できます。フレームオブジェクトのプロパティの概要をご覧ください。

于 2010-03-01T21:43:51.407 に答える
5

トレースバックモジュールが好きです。

を使用してトレースバックオブジェクトを取得できます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

于 2011-11-27T16:30:13.780 に答える
2

あなたはそのような関数を定義します(ここのドキュメント):

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)

于 2013-03-30T17:31:02.677 に答える
0

AndiDogの回答に加えて、スタックを上下に移動して、地元の人などを調べることができることinspectに注意してください。pdb標準ライブラリのソースは、そのpdb.pyようなことを行う方法を学ぶのに役立つかもしれません。

于 2010-03-02T02:09:13.947 に答える