13

2つのオブジェクトの違いについて混乱しています。

  • inspect.trace()例外の処理中に返されるフレームのリスト
  • によって返されたsys.exc_info()[2](またはへの呼び出しで渡されたsys.excepthook)トレースバック

2つのオブジェクトには同じ情報が含まれていますか?異なるデータ構造に編成されていますか?そうでない場合、一方が他方にないものは何ですか?

4

1 に答える 1

8

inspect.traceのドキュメントから:

検査します。トレース([コンテキスト])

現在のフレームと、現在処理されている例外が発生したフレームとの間のスタックのフレームレコードのリストを返します。リストの最初のエントリは呼び出し元を表します。最後のエントリは、例外が発生した場所を表します。

これは、どのフレームを取得するかをスライスおよびダイスするための優れた方法を提供することを示唆していますsys.exc_info()[2]

ソースを見ると、これは次のとおりです。

def trace(context=1):
    """Return a list of records for the stack below the current exception."""
    return getinnerframes(sys.exc_info()[2], context)

3.2または2.7と同じ)は、まさにそれが行うことですが、それを通過させgetinnerframes、docstringごとにいくつかの有用な情報で注釈を付けます。

トレースバックのフレームとすべての下位フレームのレコードのリストを取得します。

各レコードには、フレームオブジェクト、ファイル名、行番号、関数名、コンテキスト行のリスト、およびコンテキスト内のインデックスが含まれています。

そして、それが実際に何を意味するのか知りたいので:

import sys
import inspect
from pprint import pprint


def errorer():
    raise Exception('foo')

def syser():
    try:
        errorer()
    except Exception, e:
        tb = sys.exc_info()[2]
        print tb.tb_frame
        print tb.tb_lasti
        print tb.tb_lineno
        print tb.tb_next

def inspecter():
    try:
        errorer()
    except Exception, e:
        pprint(inspect.trace())

これは、プロンプトから呼び出されたときに、これらのフィールドとオブジェクトの多くが見つけやすい定義を持っていることを思い出しながら、次のようになります。

>>> syser()
<frame object at 0x1441240>
6
10
<traceback object at 0x13eb3b0>
>>> inspecter()
[(<frame object at 0x14a5590>,
  '/tmp/errors.py',
  22,
  'inspecter',
  None,
  None),
 (<frame object at 0x14a21b0>,
  '/tmp/errors.py',
  8,
  'errorer',
  None,
  None)]

(フォーマットをめちゃくちゃにしたので、行番号が飛び交いました)

inspect.trace()明らかに少し良いです。

于 2012-04-11T23:36:02.107 に答える