1466 Stimmen

Wie kann man den vollständigen Traceback der Ausnahme abfangen und ausgeben, ohne das Programm anzuhalten/zu beenden?

Ich möchte Ausnahmen abfangen und protokollieren, ohne zu beenden, z. B.,

try:
    do_stuff()
except Exception as err:
    print(Exception, err)
    # I want to print the entire traceback here,
    # not just the exception name and details

Ich möchte genau die gleiche Ausgabe drucken, die gedruckt wird, wenn die Ausnahme ausgelöst wird, ohne dass die try/except die Ausnahme abfängt, und ich tue no Ich möchte, dass es mein Programm beendet.

17 Stimmen

Das ist zwar keine vollständige Antwort, aber vielleicht möchte jemand wissen, dass man viele Informationen erhalten kann, wenn man in err.__traceback__ (zumindest in Python 3.x)

35 Stimmen

Es wurde 825.000 Mal aufgerufen, während man versuchte, herauszufinden, wie man seine Stacktraces ausdrucken kann. Das ist ein weiteres Zen von Python.

13 Stimmen

Anscheinend bin ich der Einzige auf der Welt, der den Stapel ausdrucken möchte. wenn kein Fehler vorliegt (= nur um zu sehen, wie ich genau zu dieser Zeile gekommen bin (es ist nicht mein Code, und er ist so hässlich, dass ich nicht weiß, wie er hierher gekommen ist!)).

10voto

Edward Newell Punkte 14866

Um die genau Stapelverfolgung als Zeichenkette, die würde ausgelöst worden wäre, wenn kein try/except vorhanden wäre, um sie zu übergehen, setzen Sie dies einfach in den except-Block, der die beanstandete Ausnahme abfängt.

desired_trace = traceback.format_exc(sys.exc_info())

So verwenden Sie es (vorausgesetzt flaky_func definiert ist, und log ruft Ihr bevorzugtes Protokollierungssystem auf):

import traceback
import sys

try:
    flaky_func()
except KeyboardInterrupt:
    raise
except Exception:
    desired_trace = traceback.format_exc(sys.exc_info())
    log(desired_trace)

Es ist eine gute Idee, zu fangen und zu re-raisen KeyboardInterrupt s, so dass Sie das Programm immer noch mit Strg-C beenden können. Die Protokollierung liegt außerhalb des Rahmens dieser Frage, aber eine gute Option ist Protokollierung . Dokumentation für das sys y Traceback Module.

7 Stimmen

T desired_trace = traceback.format_exc() . sys.exc_info() -

1 Stimmen

traceback.format_exc(sys.exc_info()) funktioniert bei mir nicht mit Python 3.6.10

9voto

Alexander Serkin Punkte 1439
import io
import traceback

try:
    call_code_that_fails()
except:

    errors = io.StringIO()
    traceback.print_exc(file=errors)
    contents = str(errors.getvalue())
    print(contents)
    errors.close()

6 Stimmen

2 Kommentare: Die Verwendung von traceback.print_exc() wurde bereits in früheren Antworten erörtert. Noch wichtiger ist die Frage, warum all das Herumgeeiere mit io.StringIO wenn diese letzten fünf Zeilen genau gleich sind wie traceback.print_exc() ?

4 Stimmen

@joanis Ich glaube, dass diese Zeilen nützlich sind, wenn Sie Zugriff auf den Fehlertext erhalten möchten und nicht nur drucken. Ich persönlich fand es nützlich, weil ich den Stack-Trace in einer Datenbank aufzeichne.

9voto

Ivo van der Wijk Punkte 15553

Sie müssen die try/except-Schleife innerhalb der innersten Schleife einfügen, in der der Fehler auftreten kann, d. h.

for i in something:
    for j in somethingelse:
        for k in whatever:
            try:
                something_complex(i, j, k)
            except Exception, e:
                print e
        try:
            something_less_complex(i, j)
        except Exception, e:
            print e

... und so weiter

Mit anderen Worten, Sie müssen Anweisungen, die in try/except fehlschlagen können, so spezifisch wie möglich in die innerste Schleife verpacken, die möglich ist.

7voto

Basj Punkte 36025

Eine Bemerkung zu diese Antwort Kommentare: print(traceback.format_exc()) macht für mich einen besseren Job als traceback.print_exc() . Bei letzterem ist die hello wird manchmal seltsam mit dem Traceback-Text "vermischt", z.B. wenn beide gleichzeitig nach stdout oder stderr schreiben wollen, was zu einer merkwürdigen Ausgabe führt (zumindest wenn man aus einem Texteditor heraus baut und die Ausgabe im "Build results"-Panel betrachtet).

Traceback (letzter Aufruf):
Datei " C:\Users\User\Desktop\test.py ", Zeile 7, in
Hölle do_stuff()
Datei " C:\Users\User\Desktop\test.py ", Zeile 4, in do_stuff
1/0
ZeroDivisionError: Ganzzahlige Division oder Modulo durch Null
o
[Beendet in 0,1s]

Also benutze ich:

import traceback, sys

def do_stuff():
    1/0

try:
    do_stuff()
except Exception:
    print(traceback.format_exc())
    print('hello')

4voto

nmichaels Punkte 47432

Sie wollen die Traceback Modul. Damit können Sie Stack-Dumps ausgeben, wie es Python normalerweise tut. Insbesondere die print_last Funktion gibt die letzte Ausnahme und einen Stack-Trace aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X