traceback --- スタックトレースの表示または取得¶
ソースコード: Lib/traceback.py
このモジュールは、Python プログラムのスタックトレースを抽出、書式化、表示する標準的なインターフェースを提供します。 インタープリタのデフォルトのトレースバック表示より柔軟で、出力の一部をカスタマイズできます。 また、実際の例外への参照を保存せずに、後で表示するために十分な情報を取得するユーティリティもあります。 例外は、多数のオブジェクトが参照でつながった構造の起点になることがあるため、このユーティリティを使うとメモリ管理を大幅に改善できます。
このモジュールは トレースバックオブジェクト を使います。
これは types.TracebackType 型のオブジェクトで、BaseException インスタンスの __traceback__ フィールドに代入されます。
参考
faulthandlerモジュール明示的な呼び出し時、障害発生時、タイムアウト後、またはユーザーシグナルの受信時に、Python のトレースバックを出力するために使います。
pdbモジュールPython プログラム用の対話的なソースコードデバッガです。
モジュールの API は 2 つに分けられます。
基本的な機能を提供するモジュールレベルの関数。 例外やトレースバックを対話的に調べるときに便利です。
TracebackExceptionクラスと、それを補助するStackSummaryおよびFrameSummaryクラス。 生成する出力をより柔軟に制御できるほか、実際の例外オブジェクトやトレースバックオブジェクトへの参照を保持せずに、後で書式化するために必要な情報を保存できます。
モジュールレベルの関数¶
- traceback.print_tb(tb, limit=None, file=None)¶
limit が正の場合、トレースバックオブジェクト tb から、呼び出し元のフレームを先頭に最大 limit 個のスタックトレース項目を出力します。 それ以外の場合は、末尾の
abs(limit)個の項目を出力します。 limit を省略するかNoneを指定すると、すべての項目を出力します。 file を省略するかNoneを指定すると、sys.stderrに出力します。 それ以外の場合は、出力を受け取る開かれた ファイル または file-like object を指定してください。注釈
limit 引数の意味は
sys.tracebacklimitとは異なります。 負の limit は正のsys.tracebacklimitに相当しますが、正の limit の動作はsys.tracebacklimitでは実現できません。バージョン 3.5 で変更: 負の limit がサポートされました。
- traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)¶
トレースバックオブジェクト tb から例外の情報とスタックトレースの項目を file に出力します。 この関数は以下の点で
print_tb()と異なります:tb が
Noneでない場合ヘッダTraceback (most recent call last):を出力しますスタックトレースの後に例外タイプと value を出力します
type(value) が
SyntaxErrorであり、 value が適切な形式を持っていれば、そのエラーのおおよその位置を示すマークと共にシンタックスエラーが発生した行が表示されます。
Python 3.10 以降では、value と tb を渡す代わりに、最初の引数として例外オブジェクトを渡せます。 value と tb を指定した場合は、後方互換性のために最初の引数を無視します。
オプション引数 limit の意味は
print_tb()のものと同じです。 chain が真の場合 (デフォルト)、連鎖した例外 (例外の__cause__か__context__属性) も出力されます。 これはインタープリタ自身が処理されていない例外を出力するときと同じです。バージョン 3.5 で変更: 引数 etype は無視され、 value の型から推論されます。
バージョン 3.10 で変更: etype 引数は exc に名前が変わり、位置専用引数になりました。
- traceback.print_exc(limit=None, file=None, chain=True)¶
print_exception(sys.exception(), limit=limit, file=file, chain=chain)の省略表現です。
- traceback.print_last(limit=None, file=None, chain=True)¶
print_exception(sys.last_exc, limit=limit, file=file, chain=chain)の省略表現です。 一般に、例外が対話的なプロンプトに達した後にのみ機能します (sys.last_exc参照)。
- traceback.print_stack(f=None, limit=None, file=None)¶
limit が正の場合、呼び出し地点からさかのぼった最大 limit 個のスタックトレース項目を出力します。 0 以下の場合は、スタックをさかのぼった末尾側の
abs(limit)個、つまり最も古い側の項目を出力します。 limit が省略されるかNoneの場合は、すべての項目を出力します。 オプションの f 引数で、開始する スタックフレーム を指定できます。 オプションの file 引数はprint_tb()の場合と同じ意味です。バージョン 3.5 で変更: 負の limit がサポートされました。
- traceback.extract_tb(tb, limit=None)¶
トレースバックオブジェクト tb から抽出した「前処理済み」のスタックトレース項目のリストを表す、
StackSummaryオブジェクトを返します。 スタックトレースを別の形式に整えるときに便利です。 省略可能な limit 引数の意味はprint_tb()と同じです。 「前処理済み」のスタックトレース項目はFrameSummaryオブジェクトで、通常のスタックトレースに表示される情報を属性として持ちます。
- traceback.extract_stack(f=None, limit=None)¶
現在の スタックフレーム から生のトレースバックを取り出します。戻り値は
extract_tb()と同じ形式です。オプションの f と limit 引数はprint_stack()と同じ意味を持ちます。
- traceback.print_list(extracted_list, file=None)¶
Print the list of tuples as returned by
extract_tb()orextract_stack()as a formatted stack trace to the given file. If file isNone, the output is written tosys.stderr.
- traceback.format_list(extracted_list)¶
extract_tb()またはextract_stack()が返すような、タプルまたはFrameSummaryオブジェクトからなるリストを受け取り、表示用に整えた文字列のリストを返します。 戻り値の各文字列は、引数のリストの同じインデックスにある要素に対応します。 各文字列の末尾には改行が付きます。 ソースコード行がNoneでない要素については、文字列の途中にも改行が含まれることがあります。
- traceback.format_exception_only(exc, /, [value, ]*, show_group=False)¶
sys.last_excなどで得られる例外の値を使い、トレースバックの例外部分を書式化します。 戻り値は、各要素が改行で終わる文字列のリストです。 リストには例外のメッセージが含まれ、通常は 1 つの文字列になります。 ただしSyntaxErrorの場合は、構文エラーの位置についての詳細を表示する複数行が含まれます。 メッセージの後には、例外の注釈が含まれます。Python 3.10 以降では、value を渡す代わりに、最初の引数として例外オブジェクトを渡せます。 value を指定した場合は、後方互換性のために最初の引数を無視します。
show_group が
Trueで、例外がBaseExceptionGroupのインスタンスである場合は、ネストした例外も再帰的に含め、ネストの深さに応じてインデントします。バージョン 3.10 で変更: etype 引数は exc に名前が変わり、位置専用引数になりました。
バージョン 3.11 で変更: 返されるリストに、例外に付けられた
注釈も含まれるようになりました。バージョン 3.13 で変更: show_group 引数が追加されました。
- traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)¶
スタックトレースと例外情報を書式化します。引数は
print_exception()の対応する引数と同じ意味を持ちます。戻り値は文字列のリストで、それぞれの文字列は改行で終わり、そのいくつかは内部に改行を含みます。これらの行が連結されて出力される場合は、厳密にprint_exception()と同じテキストが出力されます。バージョン 3.5 で変更: 引数 etype は無視され、 value の型から推論されます。
バージョン 3.10 で変更: 動作とシグネチャが
print_exception()に合わせて変更されました。
- 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)¶
トレースバック tb の各 フレームオブジェクト の
clear()メソッドを呼び出し、すべてのスタックフレームのローカル変数を消去します。Added in version 3.4.
- traceback.walk_stack(f)¶
指定されたフレームから
f.f_backをたどってスタックを走査し、各フレームとその行番号を生成します。 f がNoneの場合は現在のスタックを使います。 この補助関数はStackSummary.extract()と組み合わせて使います。Added in version 3.5.
バージョン 3.14 で変更: 以前は、最初に反復されたときにスタックを走査するジェネレータを返していました。 現在返されるジェネレータは、
walk_stackが呼ばれた時点のスタックの状態を表します。
- traceback.walk_tb(tb)¶
tb_nextをたどってトレースバックを走査し、各フレームとその行番号を生成します。 この補助関数はStackSummary.extract()と組み合わせて使います。Added in version 3.5.
TracebackException オブジェクト¶
Added in version 3.5.
TracebackException オブジェクトは、実際の例外から作成され、後で表示するためのデータを保持します。
トレースバック オブジェクトや フレーム オブジェクトへの参照を保持せず、より軽量に情報を保存できます。
また、上記のモジュールレベルの関数よりも多くの出力設定オプションがあります。
- class traceback.TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)¶
後で表示するために例外の情報を取得します。 limit、lookup_lines、capture_locals の意味は
StackSummaryクラスと同じです。compact が真の場合は、
TracebackExceptionのformat()メソッドに必要なデータだけをクラスの属性に保存します。 特に、__context__フィールドを計算するのは、__cause__がNoneかつ__suppress_context__が偽の場合だけです。局所変数がキャプチャされたとき、それらはトレースバックに表示されることに注意してください。
max_group_width と max_group_depth は例外グループの書式化を制御します (
BaseExceptionGroupを参照)。 深さはグループのネストの段数、幅は 1 つの例外グループの例外配列のサイズを指します。 どちらかの上限を超えると、書式化された出力を切り詰めます。バージョン 3.10 で変更: compact 引数が追加されました。
バージョン 3.11 で変更: max_group_width と max_group_depth 引数が追加されました。
- __context__¶
元々の
__context__のTracebackException。
- exceptions¶
If
selfrepresents anExceptionGroup, this field holds a list ofTracebackExceptioninstances representing the nested exceptions. Otherwise it isNone.Added in version 3.11.
- __suppress_context__¶
元々の例外からの
__suppress_context__。
- __notes__¶
元の例外の
__notes__の値で、例外に注釈がなければNoneです。Noneでなければ、トレースバック内で例外の文字列の後に書式化して表示します。Added in version 3.11.
- stack¶
トレースバックを表す
StackSummary。
- exc_type¶
元の例外のクラス。
バージョン 3.13 で非推奨.
- exc_type_str¶
元の例外のクラスの表示用文字列。
Added in version 3.13.
- filename¶
構文エラー用 - エラーが発生したファイルの名前。
- lineno¶
構文エラー用 - エラーが発生した行番号。
- end_lineno¶
構文エラー用 - エラーが発生した範囲の末尾の行番号。 情報がない場合は
Noneになることがあります。Added in version 3.10.
- text¶
構文エラー用 - エラーが発生したテクスト。
- offset¶
構文エラー用 - エラーが発生したテクストへのオフセット。
- end_offset¶
構文エラー用 - エラーが発生した範囲のテキスト内の末尾のオフセット。 情報がない場合は
Noneになることがあります。Added in version 3.10.
- msg¶
構文エラー用 - コンパイラのエラーメッセージ。
- classmethod from_exception(exc, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)¶
後のレンダリングのために例外をキャプチャします。 limit、lookup_lines、capture_locals は
StackSummaryclass のものです。局所変数がキャプチャされたとき、それらはトレースバックに表示されることに注意してください。
- print(*, file=None, chain=True)¶
format()が返す例外情報を file (デフォルトはsys.stderr) に出力します。Added in version 3.11.
- format(*, chain=True)¶
例外を書式化します。
chain が
Trueでない場合__cause__と__context__は書式化されません。返り値は文字列のジェネレータで、それぞれ改行で終わりますが、内部に改行を持つものもあります。
print_exception()はこのメソッドのラッパで、単にファイルに出力します。
- format_exception_only(*, show_group=False)¶
トレースバックの例外部を書式化します。
返り値は文字列のジェネレータで、それぞれ改行で終わります。
show_group が
Falseの場合、ジェネレータは例外のメッセージと、存在する場合はその注釈を順に生成します。 例外のメッセージは通常 1 つの文字列ですが、SyntaxErrorの場合は、構文エラーの位置についての詳細を表示する複数行からなります。show_group が
Trueで、例外がBaseExceptionGroupのインスタンスである場合は、ネストした例外も再帰的に含め、ネストの深さに応じてインデントします。バージョン 3.11 で変更: 例外の
注釈が出力に含まれるようになりました。バージョン 3.13 で変更: show_group パラメータが追加されました。
StackSummary オブジェクト¶
Added in version 3.5.
StackSummary オブジェクトは書式化の準備ができているコールスタックを表します。
- class traceback.StackSummary¶
- classmethod extract(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)¶
ジェネレータ (例えば
walk_stack()やwalk_tb()が返すもの) からStackSummaryを構築します。limit を指定すると、frame_gen からその数のフレームだけを取得します。 lookup_lines が
Falseの場合、返されるFrameSummaryオブジェクトはまだソースコード行を読み込んでいないため、StackSummaryの作成コストを抑えられます (実際には書式化しない可能性がある場合に役立ちます)。 capture_locals がTrueの場合、各FrameSummaryのローカル変数を、オブジェクトのrepr()の結果として保存します。バージョン 3.12 で変更: ローカル変数の
repr()が送出する例外が、呼び出し元へ伝播しなくなりました (capture_locals がTrueの場合)。
- classmethod from_list(a_list)¶
指定された
FrameSummaryオブジェクトのリスト、または従来のタプルのリストからStackSummaryオブジェクトを構築します。 各タプルは、filename、lineno、name、line を要素とする 4 要素のタプルにしてください。
- format()¶
表示用に整えた文字列のリストを返します。 各文字列は、スタック内の 1 つの フレーム に対応します。 各文字列の末尾には改行が付きます。 ソースコード行を含む項目では、文字列の途中にも改行が含まれることがあります。
同じフレームと行が長く繰り返される場合は、最初の数回を表示し、続いて残りの繰り返し回数を正確に示す要約行を表示します。
バージョン 3.6 で変更: フレームの長い繰り返しが省略されるようになりました。
- format_frame_summary(frame_summary)¶
スタック内の 1 つの フレーム を表示するための文字列を返します。
StackSummary.format()が表示する各FrameSummaryオブジェクトに対して呼び出されます。Noneを返した場合、そのフレームは出力から除外されます。Added in version 3.11.
FrameSummary オブジェクト¶
Added in version 3.5.
FrameSummary オブジェクトは、トレースバック 内の 1 つの フレーム を表します。
- class traceback.FrameSummary(filename, lineno, name, *, lookup_line=True, locals=None, line=None, end_lineno=None, colno=None, end_colno=None)¶
書式化または表示する トレースバック やスタック内の、1 つの フレーム を表します。 必要に応じて、そのフレームのローカル変数を文字列にしたものも含められます。 lookup_line が
Falseの場合、FrameSummaryのline属性にアクセスするまでソースコードを取得しません (tupleへの変換時にも、この属性へのアクセスが発生します)。lineを直接指定すると、ソースコード行の取得を完全に避けられます。 locals は省略可能なローカル変数のマッピングです。 指定すると、後で表示するために変数のrepr()の結果を保存します。FrameSummaryインスタンスは以下の属性を持ちます:- filename¶
このフレームのソースコードのファイル名。 フレームオブジェクト f の
f.f_code.co_filenameへのアクセスと同等です。
- lineno¶
このフレームのソースコードの行番号。
- name¶
フレームオブジェクト f の
f.f_code.co_nameへのアクセスと同等です。
- line¶
A string representing the source code for this frame, with leading and trailing whitespace stripped. If the source is not available, it is
None.
- end_lineno¶
このフレームのソースコードの末尾の行番号。 デフォルトは
linenoで、行番号は 1 から始まります。バージョン 3.13 で変更: デフォルト値が
Noneからlinenoに変わりました。
- colno¶
このフレームのソースコードの列番号。 デフォルトは
Noneで、列番号は 0 から始まります。
- end_colno¶
このフレームのソースコードの末尾の列番号。 デフォルトは
Noneで、列番号は 0 から始まります。
モジュールレベルの関数の使用例¶
この簡単な例では基本的な read-eval-print ループを実装しています。標準的な Python の対話インタープリタループに似ていますが、 Python のものより便利ではありません。インタープリタループのより完全な実装については、 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_life()
def bright_side_of_life():
return tuple()[0]
try:
lumberjack()
except IndexError as exc:
print("*** print_tb:")
traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
print("*** print_exception:")
traceback.print_exception(exc, 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:")
print(repr(traceback.format_exception(exc)))
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_life()
~~~~~~~~~~~~~~~~~~~^^
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_life()
~~~~~~~~~~~~~~~~~~~^^
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 default[0]>", line 10, in <module>\n lumberjack()\n ~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\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_life>]
*** format_tb:
[' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\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(an_error)
['IndexError: tuple index out of range\n']
TracebackException の使用例¶
補助クラスを使うと、さらに多くのオプションを利用できます。
>>> import sys
>>> from traceback import TracebackException
>>>
>>> def lumberjack():
... bright_side_of_life()
...
>>> def bright_side_of_life():
... t = "bright", "side", "of", "life"
... return t[5]
...
>>> try:
... lumberjack()
... except IndexError as e:
... exc = e
...
>>> try:
... try:
... lumberjack()
... except:
... 1/0
... except Exception as e:
... chained_exc = e
...
>>> # limit works as with the module-level functions
>>> TracebackException.from_exception(exc, limit=-2).print()
Traceback (most recent call last):
File "<python-input-1>", line 6, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-1>", line 10, in bright_side_of_life
return t[5]
~^^^
IndexError: tuple index out of range
>>> # capture_locals adds local variables in frames
>>> TracebackException.from_exception(exc, limit=-2, capture_locals=True).print()
Traceback (most recent call last):
File "<python-input-1>", line 6, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-1>", line 10, in bright_side_of_life
return t[5]
~^^^
t = ("bright", "side", "of", "life")
IndexError: tuple index out of range
>>> # The *chain* kwarg to print() controls whether chained
>>> # exceptions are displayed
>>> TracebackException.from_exception(chained_exc).print()
Traceback (most recent call last):
File "<python-input-19>", line 4, in <module>
lumberjack()
~~~~~~~~~~^^
File "<python-input-8>", line 7, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-8>", line 11, in bright_side_of_life
return t[5]
~^^^
IndexError: tuple index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<python-input-19>", line 6, in <module>
1/0
~^~
ZeroDivisionError: division by zero
>>> TracebackException.from_exception(chained_exc).print(chain=False)
Traceback (most recent call last):
File "<python-input-19>", line 6, in <module>
1/0
~^~
ZeroDivisionError: division by zero