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

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

traceback —スタックトレースバックを出力または取得します

ソースコード: :source: `Lib / traceback.py`



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

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

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

traceback.print_tb(tb, limit=None, file=None)

limit が正の場合、トレースバックオブジェクト tb (呼び出し元のフレームから開始)から最大 limit スタックトレースエントリを出力します。 それ以外の場合は、最後のabs(limit)エントリを印刷します。 limit を省略した場合、またはNoneの場合、すべてのエントリが出力されます。 ファイルを省略した場合、またはNoneの場合、出力はsys.stderrになります。 それ以外の場合は、出力を受け取るために開いているファイルまたはファイルのようなオブジェクトである必要があります。

バージョン3.5で変更:負の制限サポートが追加されました。

traceback.print_exception(etype, value, tb, limit=None, file=None, chain=True)

例外情報を出力し、トレースバックオブジェクト tb からファイルにトレースエントリをスタックします。 これは、 print_tb()と次の点で異なります。

  • tbNoneでない場合は、ヘッダーTraceback (most recent call last):を出力します。

  • スタックトレースの後に例外 etypevalue を出力します

  • type(value)SyntaxError で、 value の形式が適切な場合、構文エラーが発生した行に、エラー。

オプションの limit 引数は、 print_tb()の場合と同じ意味です。 chain がtrue(デフォルト)の場合、チェーンされた例外(例外の__cause__または__context__属性)も、インタープリター自体が次の場合と同様に出力されます。未処理の例外を出力します。

バージョン3.5で変更: etype 引数は無視され、 value のタイプから推測されます。

traceback.print_exc(limit=None, file=None, chain=True)
これはprint_exception(*sys.exc_info(), limit, file, chain)の省略形です。
traceback.print_last(limit=None, file=None, chain=True)
これはprint_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file, chain)の省略形です。 一般に、例外が対話型プロンプトに達した後にのみ機能します( sys.last_type を参照)。
traceback.print_stack(f=None, limit=None, file=None)

limit が正の場合、最大 limit スタックトレースエントリ(呼び出しポイントから開始)を出力します。 それ以外の場合は、最後のabs(limit)エントリを印刷します。 limit を省略した場合、またはNoneの場合、すべてのエントリが出力されます。 オプションの f 引数を使用して、開始する代替スタックフレームを指定できます。 オプションの file 引数は、 print_tb()の場合と同じ意味です。

バージョン3.5で変更:負の制限サポートが追加されました。

traceback.extract_tb(tb, limit=None)
トレースバックオブジェクト tb から抽出された「前処理された」スタックトレースエントリのリストを表す StackSummary オブジェクトを返します。 スタックトレースの代替フォーマットに役立ちます。 オプションの limit 引数は、 print_tb()の場合と同じ意味です。 「前処理された」スタックトレースエントリは、属性filenamelinenoname、およびlineを表す FrameSummary オブジェクトです。通常、スタックトレース用に出力される情報。 lineは、先頭と末尾の空白が削除された文字列です。 ソースが利用できない場合は、Noneです。
traceback.extract_stack(f=None, limit=None)
現在のスタックフレームから生のトレースバックを抽出します。 戻り値は extract_tb()と同じ形式です。 オプションの f および limit 引数は、 print_stack()の場合と同じ意味を持ちます。
traceback.format_list(extracted_list)
extract_tb()または extract_stack()によって返されるタプルまたは FrameSummary オブジェクトのリストが与えられた場合、印刷の準備ができている文字列のリストを返します。 結果のリストの各文字列は、引数リストの同じインデックスを持つアイテムに対応します。 各文字列は改行で終わります。 ソーステキスト行がNoneでないアイテムの場合、文字列には内部改行も含まれる場合があります。
traceback.format_exception_only(etype, value)
トレースバックの例外部分をフォーマットします。 引数は、sys.last_typesys.last_valueで指定されているような例外の型と値です。 戻り値は文字列のリストであり、それぞれが改行で終わります。 通常、リストには単一の文字列が含まれます。 ただし、 SyntaxError 例外の場合、構文エラーが発生した場所に関する詳細情報を(印刷時に)表示する行がいくつか含まれています。 どの例外が発生したかを示すメッセージは、常にリストの最後の文字列です。
traceback.format_exception(etype, value, tb, limit=None, chain=True)

スタックトレースと例外情報をフォーマットします。 引数は、 print_exception()に対応する引数と同じ意味を持ちます。 戻り値は文字列のリストであり、それぞれが改行で終わり、一部には内部改行が含まれています。 これらの行を連結して印刷すると、 print_exception()とまったく同じテキストが印刷されます。

バージョン3.5で変更: etype 引数は無視され、 value のタイプから推測されます。

traceback.format_exc(limit=None, chain=True)
これはprint_exc(limit)に似ていますが、ファイルに出力する代わりに文字列を返します。
traceback.format_tb(tb, limit=None)
format_list(extract_tb(tb, limit))の省略形。
traceback.format_stack(f=None, limit=None)
format_list(extract_stack(f, limit))の省略形。
traceback.clear_frames(tb)

各フレームオブジェクトのclear()メソッドを呼び出して、トレースバック tb 内のすべてのスタックフレームのローカル変数をクリアします。

バージョン3.4の新機能。

traceback.walk_stack(f)

指定されたフレームからf.f_backに続くスタックを歩き、各フレームのフレームと行番号を取得します。 fNoneの場合、現在のスタックが使用されます。 このヘルパーは、 StackSummary.extract()で使用されます。

バージョン3.5の新機能。

traceback.walk_tb(tb)

tb_nextに続いてトレースバックをウォークし、各フレームのフレームと行番号を取得します。 このヘルパーは、 StackSummary.extract()で使用されます。

バージョン3.5の新機能。

このモジュールは、次のクラスも定義します。

TracebackException オブジェクト

バージョン3.5の新機能。


TracebackException オブジェクトは、実際の例外から作成され、後で軽量な方法で印刷するためにデータをキャプチャします。

class traceback.TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False)

後でレンダリングするために例外をキャプチャします。 limitlookup_lines 、および caption_locals は、 StackSummary クラスと同じです。

ローカルがキャプチャされると、トレースバックにも表示されることに注意してください。

__cause__

オリジナルの__cause__TracebackException

__context__

オリジナルの__context__TracebackException

__suppress_context__

元の例外の__suppress_context__値。

stack

トレースバックを表す StackSummary

exc_type

元のトレースバックのクラス。

filename

構文エラーの場合-エラーが発生したファイル名。

lineno

構文エラーの場合-エラーが発生した行番号。

text

構文エラーの場合-エラーが発生したテキスト。

offset

構文エラーの場合-エラーが発生したテキストへのオフセット。

msg

構文エラーの場合-コンパイラエラーメッセージ。

classmethod from_exception(exc, *, limit=None, lookup_lines=True, capture_locals=False)

後でレンダリングするために例外をキャプチャします。 limitlookup_lines 、および caption_locals は、 StackSummary クラスと同じです。

ローカルがキャプチャされると、トレースバックにも表示されることに注意してください。

format(*, chain=True)

例外をフォーマットします。

chainTrueでない場合、__cause__および__context__はフォーマットされません。

戻り値は文字列のジェネレータであり、それぞれが改行で終わり、一部には内部改行が含まれています。 print_exception()は、このメソッドのラッパーであり、行をファイルに出力するだけです。

どの例外が発生したかを示すメッセージは、常に出力の最後の文字列です。

format_exception_only()

トレースバックの例外部分をフォーマットします。

戻り値は文字列のジェネレータであり、それぞれが改行で終わります。

通常、ジェネレータは単一の文字列を出力します。 ただし、 SyntaxError 例外の場合、構文エラーが発生した場所に関する詳細情報を(印刷時に)表示する数行が出力されます。

どの例外が発生したかを示すメッセージは、常に出力の最後の文字列です。


StackSummary オブジェクト

バージョン3.5の新機能。


StackSummary オブジェクトは、フォーマットの準備ができている呼び出しスタックを表します。

class traceback.StackSummary
classmethod extract(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)

フレームジェネレーターから StackSummary オブジェクトを作成します( walk_stack()または walk_tb()によって返されるものなど)。

limit が指定されている場合、この数のフレームのみが frame_gen から取得されます。 lookup_linesFalseの場合、返される FrameSummary オブジェクトはまだ行を読み取っていないため、 StackSummary の作成コストが安くなります(実際にフォーマットされない場合は、これは価値があるかもしれません)。 caption_localsTrueの場合、各 FrameSummary のローカル変数はオブジェクト表現としてキャプチャされます。

classmethod from_list(a_list)

提供された FrameSummary オブジェクトのリストまたは古いスタイルのタプルのリストから StackSummary オブジェクトを作成します。 各タプルは、ファイル名、lineno、name、lineを要素として持つ4タプルである必要があります。

format()

印刷の準備ができている文字列のリストを返します。 結果のリストの各文字列は、スタックの1つのフレームに対応します。 各文字列は改行で終わります。 文字列には、ソーステキスト行のあるアイテムの内部改行も含まれる場合があります。

同じフレームと行の長いシーケンスの場合、最初の数回の繰り返しが表示され、その後に追加の繰り返しの正確な数を示す要約行が続きます。

バージョン3.6で変更:繰り返されるフレームの長いシーケンスが省略されるようになりました。


FrameSummary オブジェクト

バージョン3.5の新機能。


FrameSummary オブジェクトは、トレースバック内の単一のフレームを表します。

class traceback.FrameSummary(filename, lineno, name, lookup_line=True, locals=None, line=None)
フォーマットまたは印刷されているトレースバックまたはスタック内の単一のフレームを表します。 オプションで、ローカルのフレームの文字列バージョンが含まれている場合があります。 lookup_lineFalseの場合、 FrameSummaryline属性にアクセスするまでソースコードは検索されません(これは、タプル)。 lineは直接提供される場合があり、行のルックアップがまったく発生しないようにします。 locals はオプションのローカル変数ディクショナリであり、指定されている場合、変数表現は後で表示できるようにサマリーに保存されます。


トレースバックの例

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

import sys, traceback

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

envdir = {}
while True:
    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:")
    # exc_type below is ignored on 3.5 and later
    traceback.print_exception(exc_type, exc_value, exc_traceback,
                              limit=2, file=sys.stdout)
    print("*** print_exc:")
    traceback.print_exc(limit=2, file=sys.stdout)
    print("*** format_exc, first and last line:")
    formatted_lines = traceback.format_exc().splitlines()
    print(formatted_lines[0])
    print(formatted_lines[-1])
    print("*** format_exception:")
    # exc_type below is ignored on 3.5 and later
    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:
[<FrameSummary file <doctest...>, line 10 in <module>>,
 <FrameSummary file <doctest...>, line 4 in lumberjack>,
 <FrameSummary file <doctest...>, line 7 in bright_side_of_death>]
*** 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']