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 HilfsklassenStackSummaryundFrameSummary. 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 oderNoneist, werden alle Einträge gedruckt. Wenn file weggelassen wird oderNoneist, geht die Ausgabe ansys.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 vonsys.tracebacklimit, während das Verhalten eines positiven limit-Werts nicht mitsys.tracebacklimiterreicht 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 PunktenWenn tb nicht
Noneist, wird eine KopfzeileTraceback (most recent call last):gedrucktDer Ausnahmetyp und der value werden nach dem Stack-Traceback gedruckt
Wenn type(value)
SyntaxErrorist 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 (siehesys.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 oderNoneist, 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 beiprint_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 beiprint_tb(). Ein "vorverarbeiteter" Stack-Traceback-Eintrag ist einFrameSummary-Objekt mit den Attributenfilename,lineno,nameundline, 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 beiprint_stack().
- traceback.print_list(extracted_list, file=None)¶
Druckt die Liste der Tupel, wie sie von
extract_tb()oderextract_stack()zurückgegeben werden, als formatierten Stack-Traceback in die angegebene Datei. Wenn fileNoneist, wird die Ausgabe ansys.stderrgeschrieben.
- traceback.format_list(extracted_list)¶
Gegeben eine Liste von Tupeln oder
FrameSummary-Objekten, wie sie vonextract_tb()oderextract_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 QuelltextzeileNoneist.
- 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_valuegegeben 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ürSyntaxError-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 dienotesder 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
Trueist und die Ausnahme eine Instanz vonBaseExceptionGroupist, 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 vonprint_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_backvom gegebenen Frame aus verfolgt und für jeden Frame den Frame und die Zeilennummer liefert. Wenn fNoneist, wird der aktuelle Stack verwendet. Dieser Helfer wird mitStackSummary.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_stackaufgerufen wird.
- traceback.walk_tb(tb)¶
Durchläuft einen Traceback, indem er
tb_nextverfolgt und für jeden Frame den Frame und die Zeilennummer liefert. Dieser Helfer wird mitStackSummary.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()vonTracebackExceptionerforderlich sind, in den Klassenattributen gespeichert. Insbesondere wird das Feld__context__nur berechnet, wenn__cause__Noneist 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.
- __context__¶
Ein
TracebackExceptiondes ursprünglichen__context__.
- exceptions¶
Wenn
selfeineExceptionGroupdarstellt, enthält dieses Feld eine Liste vonTracebackException-Instanzen, die die verschachtelten Ausnahmen darstellen. Andernfalls ist esNone.Hinzugefügt in Version 3.11.
- __suppress_context__¶
Der
__suppress_context__-Wert der ursprünglichen Ausnahme.
- __notes__¶
Der
__notes__-Wert der ursprünglichen Ausnahme oderNone, wenn die Ausnahme keine Notizen hat. Wenn er nichtNoneist, 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
Nonesein, 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
Nonesein, 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
Trueist, 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
Falseist, gibt der Generator die Nachricht der Ausnahme gefolgt von ihren Notizen (falls vorhanden) aus. Die Ausnahmemeldung ist normalerweise eine einzelne Zeichenkette; fürSyntaxError-Ausnahmen besteht sie jedoch aus mehreren Zeilen, die (bei der Ausgabe) detaillierte Informationen darüber anzeigen, wo der Syntaxfehler aufgetreten ist.Wenn show_group
Trueist und die Ausnahme eine Instanz vonBaseExceptionGroupist, werden die verschachtelten Ausnahmen ebenfalls rekursiv mit Einrückung relativ zu ihrer Verschachtelungstiefe eingeschlossen.Geändert in Version 3.11: Die
notesder 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 vonwalk_stack()oderwalk_tb()zurückgegeben wird).Wenn limit angegeben ist, werden nur so viele Frames aus frame_gen genommen. Wenn lookup_lines
Falseist, haben die zurückgegebenenFrameSummary-Objekte ihre Zeilen noch nicht gelesen, was die Kosten für die Erstellung desStackSummaryreduziert (was wertvoll sein kann, wenn es möglicherweise nicht formatiert wird). Wenn capture_localsTrueist, werden die lokalen Variablen in jedemFrameSummaryals Objekt-Darstellungen erfasst.Geändert in Version 3.12: Ausnahmen, die aus
repr()auf einer lokalen Variablen (wenn capture_localsTrueist) ausgelöst werden, werden nicht mehr an den Aufrufer weitergegeben.
- classmethod from_list(a_list)¶
Erstellt ein
StackSummary-Objekt aus einer bereitgestellten Liste vonFrameSummary-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 vonStackSummary.format()ausgegeben werden soll. Wenn sieNonezurü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
Falseist, wird der Quellcode erst nachgeschlagen, wenn auf das AttributlinedesFrameSummaryzugegriffen wird (was auch beim Umwandeln in eintuplegeschieht). 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.FrameSummaryInstanzen haben die folgenden Attribute- filename¶
Der Dateiname des Quellcodes für diesen Frame. Entspricht dem Zugriff auf
f.f_code.co_filenameauf einem Frame-Objekt f.
- lineno¶
Die Zeilennummer des Quellcodes für diesen Frame.
- name¶
Entspricht dem Zugriff auf
f.f_code.co_nameauf 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
linenogesetzt und die Indizierung beginnt bei 1.Geändert in Version 3.13: Der Standardwert änderte sich von
Nonezulineno.
- colno¶
Die Spaltennummer des Quellcodes für diesen Frame. Standardmäßig ist sie
Noneund die Indizierung beginnt bei 0.
- end_colno¶
Die letzte Spaltennummer des Quellcodes für diesen Frame. Standardmäßig ist sie
Noneund 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