traceback — Stack-Tracebacks drucken oder abrufen

Quellcode: Lib/traceback.py


Dieses Modul bietet eine Standard-Schnittstelle zum Extrahieren, Formatieren und Drucken von Stack-Tracebacks von Python-Programmen. Es ist flexibler als die standardmäßige Traceback-Anzeige des Interpreters und ermöglicht daher die Konfiguration bestimmter Aspekte der Ausgabe. Schließlich enthält es ein Dienstprogramm zur Erfassung genügend Informationen über eine Ausnahme, um sie später zu drucken, ohne eine Referenz auf die eigentliche Ausnahme speichern zu müssen. Da Ausnahmen die Wurzeln großer Objektgraphen sein können, kann dieses Dienstprogramm die Speicherverwaltung erheblich verbessern.

Das Modul verwendet Traceback-Objekte — dies sind Objekte vom Typ types.TracebackType, die dem Feld __traceback__ von BaseException-Instanzen zugewiesen werden.

Siehe auch

Modul faulthandler

Wird verwendet, um Python-Tracebacks explizit zu dumpen, bei einem Fehler, nach einem Timeout oder bei einem Benutzersignal.

Modul pdb

Interaktiver Quelldatei-Debugger für Python-Programme.

Die API des Moduls kann in zwei Teile unterteilt werden

  • Funktionen auf Modulebene, die grundlegende Funktionalität bieten und für die interaktive Inspektion von Ausnahmen und Tracebacks nützlich sind.

  • TracebackException-Klasse und ihre Hilfsklassen StackSummary und FrameSummary. Diese bieten sowohl mehr Flexibilität bei der generierten Ausgabe als auch die Möglichkeit, die für die spätere Formatierung erforderlichen Informationen zu speichern, ohne Referenzen auf tatsächliche Ausnahme- und Traceback-Objekte zu halten.

Hinzugefügt in Version 3.13: Die Ausgabe ist standardmäßig farblich hervorgehoben und kann über Umgebungsvariablen gesteuert werden.

Modul-Level-Funktionen

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

Druckt bis zu limit Stack-Traceback-Einträge aus dem Traceback-Objekt tb (beginnend mit dem Frame des Aufrufers), wenn limit positiv ist. Andernfalls werden die letzten abs(limit) Einträge gedruckt. Wenn limit weggelassen wird oder None ist, werden alle Einträge gedruckt. Wenn file weggelassen wird oder None ist, geht die Ausgabe an sys.stderr; andernfalls sollte es sich um ein offenes Datei- oder Datei-ähnliches Objekt handeln, das die Ausgabe empfängt.

Hinweis

Die Bedeutung des Parameters limit unterscheidet sich von der Bedeutung von sys.tracebacklimit. Ein negativer limit-Wert entspricht einem positiven Wert von sys.tracebacklimit, während das Verhalten eines positiven limit-Werts nicht mit sys.tracebacklimit erreicht werden kann.

Geändert in Version 3.5: Unterstützung für negative limit hinzugefügt.

traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)

Druckt Ausnahmeinformationen und Stack-Traceback-Einträge aus dem Traceback-Objekt tb nach file. Dies unterscheidet sich von print_tb() in folgenden Punkten

  • Wenn tb nicht None ist, wird eine Kopfzeile Traceback (most recent call last): gedruckt

  • Der Ausnahmetyp und der value werden nach dem Stack-Traceback gedruckt

  • Wenn type(value) SyntaxError ist und value das entsprechende Format hat, wird die Zeile gedruckt, in der der Syntaxfehler aufgetreten ist, mit einem Caret, der die ungefähre Position des Fehlers anzeigt.

Seit Python 3.10 kann anstelle der Übergabe von value und tb ein Ausnahmeobjekt als erstes Argument übergeben werden. Wenn value und tb bereitgestellt werden, wird das erste Argument ignoriert, um Abwärtskompatibilität zu gewährleisten.

Das optionale Argument limit hat die gleiche Bedeutung wie bei print_tb(). Wenn chain true (Standard) ist, werden auch verkettete Ausnahmen (die Attribute __cause__ oder __context__ der Ausnahme) gedruckt, so wie es der Interpreter selbst tut, wenn er eine unbehandelte Ausnahme druckt.

Geändert in Version 3.5: Das Argument etype wird ignoriert und vom Typ von value abgeleitet.

Geändert in Version 3.10: Der Parameter etype wurde in exc umbenannt und ist jetzt nur positionell.

traceback.print_exc(limit=None, file=None, chain=True)

Dies ist eine Abkürzung für print_exception(sys.exception(), limit=limit, file=file, chain=chain).

traceback.print_last(limit=None, file=None, chain=True)

Dies ist eine Abkürzung für print_exception(sys.last_exc, limit=limit, file=file, chain=chain). Im Allgemeinen funktioniert sie nur, nachdem eine Ausnahme eine interaktive Eingabeaufforderung erreicht hat (siehe sys.last_exc).

traceback.print_stack(f=None, limit=None, file=None)

Druckt bis zu limit Stack-Traceback-Einträge (beginnend am Aufrufpunkt), wenn limit positiv ist. Andernfalls werden die letzten abs(limit) Einträge gedruckt. Wenn limit weggelassen wird oder None ist, werden alle Einträge gedruckt. Das optionale Argument f kann verwendet werden, um einen alternativen Stack-Frame als Startpunkt anzugeben. Das optionale Argument file hat die gleiche Bedeutung wie bei print_tb().

Geändert in Version 3.5: Unterstützung für negative limit hinzugefügt.

traceback.extract_tb(tb, limit=None)

Gibt ein StackSummary-Objekt zurück, das eine Liste von "vorverarbeiteten" Stack-Traceback-Einträgen darstellt, die aus dem Traceback-Objekt tb extrahiert wurden. Dies ist nützlich für die alternative Formatierung von Stack-Tracebacks. Das optionale Argument limit hat die gleiche Bedeutung wie bei print_tb(). Ein "vorverarbeiteter" Stack-Traceback-Eintrag ist ein FrameSummary-Objekt mit den Attributen filename, lineno, name und line, die die Informationen darstellen, die normalerweise für einen Stack-Traceback gedruckt werden.

traceback.extract_stack(f=None, limit=None)

Extrahiert den rohen Stack-Traceback aus dem aktuellen Stack-Frame. Der Rückgabewert hat das gleiche Format wie bei extract_tb(). Die optionalen Argumente f und limit haben die gleiche Bedeutung wie bei print_stack().

traceback.print_list(extracted_list, file=None)

Druckt die Liste der Tupel, wie sie von extract_tb() oder extract_stack() zurückgegeben werden, als formatierten Stack-Traceback in die angegebene Datei. Wenn file None ist, wird die Ausgabe an sys.stderr geschrieben.

traceback.format_list(extracted_list)

Gegeben eine Liste von Tupeln oder FrameSummary-Objekten, wie sie von extract_tb() oder extract_stack() zurückgegeben werden, gibt eine Liste von Zeichenketten zurück, die zum Drucken bereit sind. Jede Zeichenkette in der Ergebnisliste entspricht dem Element mit demselben Index in der Argumentliste. Jede Zeichenkette endet mit einem Zeilenumbruch; die Zeichenketten können auch interne Zeilenumbrüche enthalten, für die Elemente, deren Quelltextzeile None ist.

traceback.format_exception_only(exc, /, [value, ]*, show_group=False)

Formatiert den Ausnahmeteil eines Tracebacks unter Verwendung eines Ausnahme-Wertes, wie er beispielsweise von sys.last_value gegeben wird. Der Rückgabewert ist eine Liste von Zeichenketten, die jeweils mit einem Zeilenumbruch enden. Die Liste enthält die Nachricht der Ausnahme, die normalerweise eine einzelne Zeichenkette ist; für SyntaxError-Ausnahmen enthält sie jedoch mehrere Zeilen, die (beim Drucken) detaillierte Informationen darüber anzeigen, wo der Syntaxfehler aufgetreten ist. Nach der Nachricht enthält die Liste die notes der Ausnahme.

Seit Python 3.10 kann anstelle der Übergabe von value ein Ausnahmeobjekt als erstes Argument übergeben werden. Wenn value bereitgestellt wird, wird das erste Argument ignoriert, um Abwärtskompatibilität zu gewährleisten.

Wenn show_group True ist und die Ausnahme eine Instanz von BaseExceptionGroup ist, werden die verschachtelten Ausnahmen ebenfalls rekursiv mit Einrückung relativ zu ihrer Verschachtelungstiefe eingeschlossen.

Geändert in Version 3.10: Der Parameter etype wurde in exc umbenannt und ist jetzt nur positionell.

Geändert in Version 3.11: Die zurückgegebene Liste enthält jetzt alle notes, die der Ausnahme zugeordnet sind.

Geändert in Version 3.13: Der Parameter show_group wurde hinzugefügt.

traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)

Formatiert einen Stack-Traceback und die Ausnahmeinformationen. Die Argumente haben die gleiche Bedeutung wie die entsprechenden Argumente für print_exception(). Der Rückgabewert ist eine Liste von Zeichenketten, die jeweils mit einem Zeilenumbruch enden und einige mit internen Zeilenumbrüchen. Wenn diese Zeilen verkettet und gedruckt werden, wird exakt derselbe Text gedruckt, wie von print_exception().

Geändert in Version 3.5: Das Argument etype wird ignoriert und vom Typ von value abgeleitet.

Geändert in Version 3.10: Das Verhalten und die Signatur dieser Funktion wurden geändert, um mit print_exception() übereinzustimmen.

traceback.format_exc(limit=None, chain=True)

Dies ist wie print_exc(limit), gibt aber eine Zeichenkette zurück, anstatt in eine Datei zu schreiben.

traceback.format_tb(tb, limit=None)

Eine Abkürzung für format_list(extract_tb(tb, limit)).

traceback.format_stack(f=None, limit=None)

Eine Abkürzung für format_list(extract_stack(f, limit)).

traceback.clear_frames(tb)

Löscht die lokalen Variablen aller Stack-Frames in einem Traceback tb, indem die Methode clear() für jedes Frame-Objekt aufgerufen wird.

Hinzugefügt in Version 3.4.

traceback.walk_stack(f)

Durchläuft einen Stack, indem er f.f_back vom gegebenen Frame aus verfolgt und für jeden Frame den Frame und die Zeilennummer liefert. Wenn f None ist, wird der aktuelle Stack verwendet. Dieser Helfer wird mit StackSummary.extract() verwendet.

Hinzugefügt in Version 3.5.

Geändert in Version 3.14: Diese Funktion gab zuvor einen Generator zurück, der den Stack beim ersten Iterieren durchlief. Der zurückgegebene Generator ist nun der Zustand des Stacks, wenn walk_stack aufgerufen wird.

traceback.walk_tb(tb)

Durchläuft einen Traceback, indem er tb_next verfolgt und für jeden Frame den Frame und die Zeilennummer liefert. Dieser Helfer wird mit StackSummary.extract() verwendet.

Hinzugefügt in Version 3.5.

TracebackException Objekte

Hinzugefügt in Version 3.5.

TracebackException Objekte werden aus tatsächlichen Ausnahmen erstellt, um Daten für die spätere Ausgabe zu erfassen. Sie bieten eine schlankere Methode zur Speicherung dieser Informationen, da sie keine Referenzen auf Traceback- und Frame-Objekte halten. Darüber hinaus bieten sie im Vergleich zu den oben beschriebenen Funktionen auf Modulebene mehr Optionen zur Konfiguration der Ausgabe.

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)

Erfasst eine Ausnahme für die spätere Darstellung. Die Bedeutung von limit, lookup_lines und capture_locals ist die gleiche wie bei der Klasse StackSummary.

Wenn compact true ist, werden nur Daten, die für die Methode format() von TracebackException erforderlich sind, in den Klassenattributen gespeichert. Insbesondere wird das Feld __context__ nur berechnet, wenn __cause__ None ist und __suppress_context__ false ist.

Beachten Sie, dass beim Erfassen von Locals diese auch im Traceback angezeigt werden.

max_group_width und max_group_depth steuern die Formatierung von Ausnahme-Gruppen (siehe BaseExceptionGroup). Die Tiefe bezieht sich auf die Verschachtelungsebene der Gruppe, und die Breite bezieht sich auf die Größe des Arrays der einzelnen Ausnahmen einer Gruppe. Die formatierte Ausgabe wird gekürzt, wenn eines der Limits überschritten wird.

Geändert in Version 3.10: Der Parameter compact wurde hinzugefügt.

Geändert in Version 3.11: Die Parameter max_group_width und max_group_depth wurden hinzugefügt.

__cause__

Ein TracebackException der ursprünglichen __cause__.

__context__

Ein TracebackException des ursprünglichen __context__.

exceptions

Wenn self eine ExceptionGroup darstellt, enthält dieses Feld eine Liste von TracebackException-Instanzen, die die verschachtelten Ausnahmen darstellen. Andernfalls ist es None.

Hinzugefügt in Version 3.11.

__suppress_context__

Der __suppress_context__-Wert der ursprünglichen Ausnahme.

__notes__

Der __notes__-Wert der ursprünglichen Ausnahme oder None, wenn die Ausnahme keine Notizen hat. Wenn er nicht None ist, wird er im Traceback nach der Ausnahmemeldung formatiert.

Hinzugefügt in Version 3.11.

stack

Ein StackSummary, der den Traceback darstellt.

exc_type

Die Klasse des ursprünglichen Tracebacks.

Veraltet seit Version 3.13.

exc_type_str

String-Darstellung der Klasse der ursprünglichen Ausnahme.

Hinzugefügt in Version 3.13.

filename

Bei Syntaxfehlern – der Dateiname, in dem der Fehler aufgetreten ist.

lineno

Bei Syntaxfehlern – die Zeilennummer, in der der Fehler aufgetreten ist.

end_lineno

Bei Syntaxfehlern – die Endzeilennummer, in der der Fehler aufgetreten ist. Kann None sein, wenn nicht vorhanden.

Hinzugefügt in Version 3.10.

text

Bei Syntaxfehlern – der Text, in dem der Fehler aufgetreten ist.

offset

Bei Syntaxfehlern – der Offset im Text, an dem der Fehler aufgetreten ist.

end_offset

Bei Syntaxfehlern – der End-Offset im Text, an dem der Fehler aufgetreten ist. Kann None sein, wenn nicht vorhanden.

Hinzugefügt in Version 3.10.

msg

Bei Syntaxfehlern – die Compiler-Fehlermeldung.

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

Erfasst eine Ausnahme zur späteren Wiedergabe. limit, lookup_lines und capture_locals sind wie für die Klasse StackSummary.

Beachten Sie, dass beim Erfassen von Locals diese auch im Traceback angezeigt werden.

print(*, file=None, chain=True)

Gibt die von format() zurückgegebenen Ausnahmeinformationen in file (Standard: sys.stderr) aus.

Hinzugefügt in Version 3.11.

format(*, chain=True)

Formatiert die Ausnahme.

Wenn chain nicht True ist, werden __cause__ und __context__ nicht formatiert.

Der Rückgabewert ist ein Generator von Zeichenketten, die jeweils mit einem Zeilenumbruch enden und einige interne Zeilenumbrüche enthalten. print_exception() ist ein Wrapper um diese Methode, der die Zeilen einfach in eine Datei ausgibt.

format_exception_only(*, show_group=False)

Formatiert den Ausnahmeteil des Tracebacks.

Der Rückgabewert ist ein Generator von Zeichenketten, die jeweils mit einem Zeilenumbruch enden.

Wenn show_group False ist, gibt der Generator die Nachricht der Ausnahme gefolgt von ihren Notizen (falls vorhanden) aus. Die Ausnahmemeldung ist normalerweise eine einzelne Zeichenkette; für SyntaxError-Ausnahmen besteht sie jedoch aus mehreren Zeilen, die (bei der Ausgabe) detaillierte Informationen darüber anzeigen, wo der Syntaxfehler aufgetreten ist.

Wenn show_group True ist und die Ausnahme eine Instanz von BaseExceptionGroup ist, werden die verschachtelten Ausnahmen ebenfalls rekursiv mit Einrückung relativ zu ihrer Verschachtelungstiefe eingeschlossen.

Geändert in Version 3.11: Die notes der Ausnahme sind nun in der Ausgabe enthalten.

Geändert in Version 3.13: Der Parameter show_group wurde hinzugefügt.

StackSummary Objekte

Hinzugefügt in Version 3.5.

StackSummary Objekte stellen einen Aufrufstapel dar, der für die Formatierung bereit ist.

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

Erstellt ein StackSummary-Objekt aus einem Frame-Generator (wie er von walk_stack() oder walk_tb() zurückgegeben wird).

Wenn limit angegeben ist, werden nur so viele Frames aus frame_gen genommen. Wenn lookup_lines False ist, haben die zurückgegebenen FrameSummary-Objekte ihre Zeilen noch nicht gelesen, was die Kosten für die Erstellung des StackSummary reduziert (was wertvoll sein kann, wenn es möglicherweise nicht formatiert wird). Wenn capture_locals True ist, werden die lokalen Variablen in jedem FrameSummary als Objekt-Darstellungen erfasst.

Geändert in Version 3.12: Ausnahmen, die aus repr() auf einer lokalen Variablen (wenn capture_locals True ist) ausgelöst werden, werden nicht mehr an den Aufrufer weitergegeben.

classmethod from_list(a_list)

Erstellt ein StackSummary-Objekt aus einer bereitgestellten Liste von FrameSummary-Objekten oder einer alten Liste von Tupeln. Jedes Tupel sollte ein 4-Tupel mit filename, lineno, name, line als Elementen sein.

format()

Gibt eine Liste von Zeichenketten zurück, die zum Drucken bereit sind. Jede Zeichenkette in der resultierenden Liste entspricht einem einzigen Frame im Stapel. Jede Zeichenkette endet mit einem Zeilenumbruch; die Zeichenketten können auch interne Zeilenumbrüche enthalten, für die Elemente mit Quelltextzeilen.

Bei langen Sequenzen desselben Frames und derselben Zeile werden die ersten paar Wiederholungen angezeigt, gefolgt von einer Zusammenfassungszeile, die die genaue Anzahl weiterer Wiederholungen angibt.

Geändert in Version 3.6: Lange Sequenzen wiederholter Frames werden nun abgekürzt.

format_frame_summary(frame_summary)

Gibt eine Zeichenkette für die Ausgabe eines der am Stapel beteiligten Frames zurück. Diese Methode wird für jedes FrameSummary-Objekt aufgerufen, das von StackSummary.format() ausgegeben werden soll. Wenn sie None zurückgibt, wird der Frame von der Ausgabe ausgeschlossen.

Hinzugefügt in Version 3.11.

FrameSummary Objekte

Hinzugefügt in Version 3.5.

Ein FrameSummary-Objekt stellt einen einzelnen Frame in einem Traceback dar.

class traceback.FrameSummary(filename, lineno, name, *, lookup_line=True, locals=None, line=None, end_lineno=None, colno=None, end_colno=None)

Stellt einen einzelnen Frame im Traceback oder Stack dar, der formatiert oder ausgegeben wird. Er kann optional eine stringifizierte Version der lokalen Variablen des Frames enthalten. Wenn lookup_line False ist, wird der Quellcode erst nachgeschlagen, wenn auf das Attribut line des FrameSummary zugegriffen wird (was auch beim Umwandeln in ein tuple geschieht). line kann direkt angegeben werden und verhindert dann überhaupt das Nachschlagen der Zeile. locals ist ein optionales Mapping lokaler Variablen, und wenn es angegeben ist, werden die Variablen-Darstellungen in der Zusammenfassung gespeichert, um sie später anzuzeigen.

FrameSummary Instanzen haben die folgenden Attribute

filename

Der Dateiname des Quellcodes für diesen Frame. Entspricht dem Zugriff auf f.f_code.co_filename auf einem Frame-Objekt f.

lineno

Die Zeilennummer des Quellcodes für diesen Frame.

name

Entspricht dem Zugriff auf f.f_code.co_name auf einem Frame-Objekt f.

line

Eine Zeichenkette, die den Quellcode für diesen Frame darstellt, mit gestripptem führenden und nachfolgenden Leerzeichen. Wenn die Quelle nicht verfügbar ist, ist sie None.

end_lineno

Die letzte Zeilennummer des Quellcodes für diesen Frame. Standardmäßig ist sie auf lineno gesetzt und die Indizierung beginnt bei 1.

Geändert in Version 3.13: Der Standardwert änderte sich von None zu lineno.

colno

Die Spaltennummer des Quellcodes für diesen Frame. Standardmäßig ist sie None und die Indizierung beginnt bei 0.

end_colno

Die letzte Spaltennummer des Quellcodes für diesen Frame. Standardmäßig ist sie None und die Indizierung beginnt bei 0.

Beispiele für die Verwendung von Modul-Funktionen

Dieses einfache Beispiel implementiert eine grundlegende Read-Eval-Print-Schleife, ähnlich (aber weniger nützlich) wie die standardmäßige interaktive Python-Interpreter-Schleife. Für eine vollständigere Implementierung der Interpreter-Schleife siehe das Modul 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)

Das folgende Beispiel demonstriert die verschiedenen Möglichkeiten, die Ausnahme und den Traceback auszugeben und zu formatieren

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)

Die Ausgabe für das Beispiel würde etwa so aussehen

*** 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

Das folgende Beispiel zeigt die verschiedenen Möglichkeiten, den Stapel auszugeben und zu formatieren

>>> 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']

Dieses letzte Beispiel demonstriert die letzten paar Formatierungsfunktionen

>>> 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']

Beispiele für die Verwendung von TracebackException

Mit der Hilfsklasse haben wir mehr Optionen

>>> 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