traceback —スタックトレースバックを印刷または取得します—Pythonドキュメント
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()と次の点で異なります。
tb が
None
でない場合は、ヘッダーTraceback (most recent call last):
を出力します。スタックトレースの後に例外 etype と value を出力します
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()の場合と同じ意味です。 「前処理された」スタックトレースエントリは、属性
filename
、lineno
、name
、および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_type
やsys.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
に続くスタックを歩き、各フレームのフレームと行番号を取得します。 f がNone
の場合、現在のスタックが使用されます。 このヘルパーは、 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)
後でレンダリングするために例外をキャプチャします。 limit 、 lookup_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)
後でレンダリングするために例外をキャプチャします。 limit 、 lookup_lines 、および caption_locals は、 StackSummary クラスと同じです。
ローカルがキャプチャされると、トレースバックにも表示されることに注意してください。
- format(*, chain=True)
例外をフォーマットします。
chain が
True
でない場合、__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_lines が
False
の場合、返される FrameSummary オブジェクトはまだ行を読み取っていないため、 StackSummary の作成コストが安くなります(実際にフォーマットされない場合は、これは価値があるかもしれません)。 caption_locals がTrue
の場合、各 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_line が
False
の場合、 FrameSummary がline
属性にアクセスするまでソースコードは検索されません(これは、タプル)。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']