Wiem, że print(e)
(gdzie e jest wyjątkiem) drukuje występujący wyjątek, ale próbowałem znaleźć odpowiednik języka Java w języku Python, e.printStackTrace()
który dokładnie śledzi wyjątek od tego, w jakiej linii wystąpił, i drukuje cały jego ślad.
Czy ktoś mógłby mi powiedzieć odpowiednik e.printStackTrace()
Pythona?
java
python
exception
stack-trace
koool
źródło
źródło
format_exc
zamiast tego uzyskać ciąg.Jest też
logging.exception
.Wynik:
(Od http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ poprzez Jak wydrukować pełny traceback bez wstrzymanie programu? )
źródło
traceback.print_exc()
?W Javie wykonuje to następujące czynności ( dokumenty ):
Jest to używane w następujący sposób:
W Javie strumień błędu standardowego nie jest buforowany, więc dane wyjściowe są dostarczane natychmiast.
Ta sama semantyka w Pythonie 2 to:
Python 3
W Pythonie 3 możemy uzyskać śledzenie bezpośrednio z obiektu wyjątku (który prawdopodobnie lepiej zachowuje się w przypadku kodu wątkowego). Ponadto, stderr jest buforowany w linii , ale funkcja print otrzymuje argument opróżnienia, więc zostanie on natychmiast wydrukowany do stderr:
Wniosek:
Dlatego w Pythonie 3,
traceback.print_exc()
chociaż używasys.stderr
domyślnie , buforowałby dane wyjściowe i możliwe, że je utracisz. Tak, aby uzyskać jak równoważnych semantyki, jak to możliwe, w Pythonie 3, korzystaćprint
zflush=True
.źródło
Dodanie do innych wielkich odpowiedzi, możemy użyć pytona
logging
bibliotecznychdebug()
,info()
,warning()
,error()
icritical()
metod. Cytując z dokumentacji dla Python 3.7.4 ,Oznacza to, że możesz użyć
logging
biblioteki Python do wyprowadzenia komunikatudebug()
lub innego rodzaju komunikatu, alogging
biblioteka uwzględni ślad wyjściowy stosu. Mając to na uwadze, możemy wykonać następujące czynności:I wyświetli:
źródło