How to print the full traceback without halting the program?
Wenn Sie nicht Ihr Programm auf einen Fehler stoppen wollen, müssen Sie mit einem Versuch diesen Fehler zu handhaben/außer:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
die vollständige Rückverfolgung zu extrahieren, werden wir verwenden das traceback
Modul aus der Standardbibliothek:
import traceback
Und eine anständig komplizierten Stacktrace zu zeigen, zu schaffen, dass wir die volle stacktrace erhalten:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
Printing
Um Druck die volle Rückverfolgung, verwenden Sie die traceback.print_exc
Methode:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Welche druckt:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Besser als Druck, Protokollierung:
Es empfiehlt sich jedoch, einen Logger für Ihr Modul einzurichten. Es wird den Namen des Moduls kennen und in der Lage seiner Ebene zu ändern (unter anderen Attributen, wie Handler)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
In diesem Fall sollten Sie die logger.exception
Funktion statt:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
welche protokolliert:
ERROR:__main__:something bad happened!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Oder vielleicht wollen Sie nur die Zeichenfolge, wobei in diesem Fall, werden Sie die traceback.format_exc
Funktion wollen statt:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Welche protokolliert:
DEBUG:__main__:Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Fazit
Und für alle drei Optionen, wir sehen wir die gleiche Leistung erhalten, wie wenn wir einen Fehler haben:
>>> do_something_that_might_error()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
Warum nicht einfach 'traceback.print_exc()' verwenden? –
Ich möchte die Zeichenfolge, ich bin froh, zeigte mir die Methode ('format_exc()'), um die Zeichenfolge :) –
@FrozenFlame, weil Sie es möglicherweise selbst protokollieren möchten, bevor es erneut – casraf