28.10. traceback —スタックトレースバックを印刷または取得します—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/traceback
移動先:案内検索

28.10。 トレースバック —スタックトレースバックを印刷または取得します

このモジュールは、Pythonプログラムのスタックトレースを抽出、フォーマット、および印刷するための標準インターフェイスを提供します。 スタックトレースを出力するときのPythonインタープリターの動作を正確に模倣します。 これは、インタプリタの周りの「ラッパー」など、プログラムの制御下でスタックトレースを印刷する場合に役立ちます。

モジュールはトレースバックオブジェクトを使用します—これは変数 sys.exc_traceback (非推奨)および sys.last_traceback に格納され、 sysから3番目のアイテムとして返されるオブジェクトタイプです。 .exc_info()

このモジュールは、次の機能を定義します。

traceback.print_tb(tb[, limit[, file]])
トレースバックオブジェクト tb から最大 limit スタックトレースエントリを出力します。 limit を省略した場合、またはNoneの場合、すべてのエントリが出力されます。 ファイルを省略した場合、またはNoneの場合、出力はsys.stderrになります。 それ以外の場合は、出力を受け取るために開いているファイルまたはファイルのようなオブジェクトである必要があります。
traceback.print_exception(etype, value, tb[, limit[, file]])
トレースバック tb からファイルへの例外情報と最大 limit スタックトレースエントリを出力します。 これは、 print_tb()と次の点で異なります。(1) tbNoneでない場合、ヘッダーTraceback (most recent call last):を出力します。 (2)スタックトレースの後に例外 etypevalue を出力します。 (3) etypeSyntaxErrorで、 value の形式が適切な場合、構文エラーが発生した行を、エラーのおおよその位置を示すキャレットとともに出力します。 。
traceback.print_exc([limit[, file]])
これはprint_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)の省略形です。 (実際、非推奨の変数を使用する代わりに、 sys.exc_info()を使用して、スレッドセーフな方法で同じ情報を取得します。)
traceback.format_exc([limit])

これはprint_exc(limit)に似ていますが、ファイルに出力する代わりに文字列を返します。

バージョン2.4の新機能。

traceback.print_last([limit[, file]])
これはprint_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)の省略形です。 一般に、例外が対話型プロンプトに達した後にのみ機能します( sys.last_type を参照)。
traceback.print_stack([f[, limit[, file]]])
この関数は、呼び出しポイントからスタックトレースを出力します。 オプションの f 引数を使用して、開始する代替スタックフレームを指定できます。 オプションの limit および file 引数は、 print_exception()の場合と同じ意味です。
traceback.extract_tb(tb[, limit])
トレースバックオブジェクト tb から抽出された最大 limit の「前処理済み」スタックトレースエントリのリストを返します。 スタックトレースの代替フォーマットに役立ちます。 limit を省略した場合、またはNoneの場合、すべてのエントリが抽出されます。 「前処理された」スタックトレースエントリは、通常は情報を表す4タプル(ファイル名行番号、関数名*、テキスト)です。スタックトレース用に印刷されます。 text は、先頭と末尾の空白が削除された文字列です。 ソースが利用できない場合は、Noneです。
traceback.extract_stack([f[, limit]])
現在のスタックフレームから生のトレースバックを抽出します。 戻り値は extract_tb()と同じ形式です。 オプションの f および limit 引数は、 print_stack()の場合と同じ意味です。
traceback.format_list(extracted_list)
extract_tb()または extract_stack()によって返されるタプルのリストを指定して、印刷の準備ができている文字列のリストを返します。 結果のリストの各文字列は、引数リストの同じインデックスを持つアイテムに対応します。 各文字列は改行で終わります。 ソーステキスト行がNoneでないアイテムの場合、文字列には内部改行も含まれる場合があります。
traceback.format_exception_only(etype, value)
トレースバックの例外部分をフォーマットします。 引数は、sys.last_typeおよびsys.last_valueで指定されるような、例外タイプ etype および value です。 戻り値は文字列のリストであり、それぞれが改行で終わります。 通常、リストには単一の文字列が含まれます。 ただし、SyntaxError例外の場合、構文エラーが発生した場所に関する詳細情報を(印刷時に)表示する行がいくつか含まれています。 どの例外が発生したかを示すメッセージは、常にリストの最後の文字列です。
traceback.format_exception(etype, value, tb[, limit])
スタックトレースと例外情報をフォーマットします。 引数は、 print_exception()に対応する引数と同じ意味を持ちます。 戻り値は文字列のリストであり、それぞれが改行で終わり、一部には内部改行が含まれています。 これらの行を連結して印刷すると、 print_exception()とまったく同じテキストが印刷されます。
traceback.format_tb(tb[, limit])
format_list(extract_tb(tb, limit))の省略形。
traceback.format_stack([f[, limit]])
format_list(extract_stack(f, limit))の省略形。
traceback.tb_lineno(tb)
この関数は、トレースバックオブジェクトに設定されている現在の行番号を返します。 -O フラグがPythonに渡された2.3より前のバージョンのPythonでは、tb.tb_linenoが正しく更新されなかったため、この関数が必要でした。 この関数は、2.3以降のバージョンでは使用できません。

28.10.1。 トレースバックの例

この簡単な例は、標準のPythonインタラクティブインタープリターループに似た(ただし、それほど有用ではない)基本的なread-eval-printループを実装します。 インタープリターループのより完全な実装については、 code モジュールを参照してください。

import sys, traceback

def run_user_code(envdir):
    source = raw_input(">>> ")
    try:
        exec source in envdir
    except:
        print "Exception in user code:"
        print '-'*60
        traceback.print_exc(file=sys.stdout)
        print '-'*60

envdir = {}
while 1:
    run_user_code(envdir)

次の例は、例外とトレースバックを印刷およびフォーマットするさまざまな方法を示しています。

import sys, traceback

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

try:
    lumberjack()
except IndexError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print "*** print_tb:"
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
    print "*** print_exception:"
    traceback.print_exception(exc_type, exc_value, exc_traceback,
                              limit=2, file=sys.stdout)
    print "*** print_exc:"
    traceback.print_exc()
    print "*** format_exc, first and last line:"
    formatted_lines = traceback.format_exc().splitlines()
    print formatted_lines[0]
    print formatted_lines[-1]
    print "*** format_exception:"
    print repr(traceback.format_exception(exc_type, exc_value,
                                          exc_traceback))
    print "*** extract_tb:"
    print repr(traceback.extract_tb(exc_traceback))
    print "*** format_tb:"
    print repr(traceback.format_tb(exc_traceback))
    print "*** tb_lineno:", exc_traceback.tb_lineno

この例の出力は次のようになります。

*** print_tb:
  File "<doctest...>", line 10, in <module>
    lumberjack()
*** print_exception:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
 '  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',
 'IndexError: tuple index out of range\n']
*** extract_tb:
[('<doctest...>', 10, '<module>', 'lumberjack()'),
 ('<doctest...>', 4, 'lumberjack', 'bright_side_of_death()'),
 ('<doctest...>', 7, 'bright_side_of_death', 'return tuple()[0]')]
*** format_tb:
['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n']
*** tb_lineno: 10

次の例は、スタックを印刷およびフォーマットするさまざまな方法を示しています。

>>> import traceback
>>> def another_function():
...     lumberstack()
...
>>> def lumberstack():
...     traceback.print_stack()
...     print repr(traceback.extract_stack())
...     print repr(traceback.format_stack())
...
>>> another_function()
  File "<doctest>", line 10, in <module>
    another_function()
  File "<doctest>", line 3, in another_function
    lumberstack()
  File "<doctest>", line 6, in lumberstack
    traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
 ('<doctest>', 3, 'another_function', 'lumberstack()'),
 ('<doctest>', 7, 'lumberstack', 'print repr(traceback.extract_stack())')]
['  File "<doctest>", line 10, in <module>\n    another_function()\n',
 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',
 '  File "<doctest>", line 8, in lumberstack\n    print repr(traceback.format_stack())\n']

この最後の例は、最後のいくつかのフォーマット関数を示しています。

>>> import traceback
>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
...                        ('eggs.py', 42, 'eggs', 'return "bacon"')])
['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',
 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']
>>> an_error = IndexError('tuple index out of range')
>>> traceback.format_exception_only(type(an_error), an_error)
['IndexError: tuple index out of range\n']