try:
something here
except:
print('the whatever error occurred.')
Jak mogę wydrukować błąd / wyjątek w moim except:
bloku?
python
exception
error-handling
TIMEX
źródło
źródło
Odpowiedzi:
W przypadku Python 2.6 i nowszych oraz Python 3.x:
W przypadku Python 2.5 i wcześniejszych użyj:
źródło
str( KeyError('bad'))
=>'bad'
- nie określa typu wyjątkuprint(repr(e))
; podstawowaException.__str__
implementacja zwraca tylko komunikat wyjątku, a nie typ. Lub użyjtraceback
modułu, który ma metody drukowania bieżącego wyjątku, sformatowanego lub pełnego śledzenia.traceback
Moduł dostarcza sposoby formatowania i drukowania wyjątki i ich tracebacks np byłoby wydrukować wyjątek jak domyślny handler robi:Wynik:
źródło
error_message = traceback.format_exc()
except Exception as ex:
...sys.exc_info()
funkcji itraceback.print_exc()
funkcja pobiera go stamtąd. Zawsze będziesz musiał podać wyjątek tylko jawnie, gdy nie obsługujesz wyjątku lub gdy chcesz wyświetlić informacje na podstawie innego wyjątku.W Pythonie 2.6 lub nowszym jest nieco czystszy:
W starszych wersjach jest nadal dość czytelny:
źródło
Jeśli chcesz przekazać ciągi błędów, oto przykład z błędów i wyjątków (Python 2.6)
źródło
(Chciałem zostawić to jako komentarz do odpowiedzi @ jldupont, ale nie mam wystarczającej reputacji).
Odpowiedzi takie jak @ jldupont widziałem także w innych miejscach. FWIW, myślę, że należy zauważyć, że to:
sys.stdout
domyślnie wypisze wyjście błędu . Bardziej odpowiednie podejście do obsługi błędów ogólnie byłoby:(Pamiętaj, że musisz to zrobić, aby
import sys
to zadziałało). W ten sposób błąd jest wypisywanySTDERR
zamiastSTDOUT
, co pozwala na poprawne parsowanie / przekierowanie / etc. Rozumiem, że pytanie dotyczyło wyłącznie „drukowania błędu”, ale wydaje się ważne, aby wskazać tutaj najlepszą praktykę, zamiast pomijać ten szczegół, który może prowadzić do niestandardowego kodu dla każdego, kto ostatecznie nie uczy się lepiej.Nie użyłem tego
traceback
modułu, jak w odpowiedzi Cat Plus Plus, i może to najlepszy sposób, ale pomyślałem, że go tam wyrzucę.źródło
Python 3:
logging
Zamiast korzystać z
print()
funkcji podstawowej ,logging
można użyć bardziej elastycznego modułu do zarejestrowania wyjątku. Dologging
oferty Moduł wiele dodatkowych funkcjonalności, np logu do danego pliku dziennika rejestrowania komunikatów ze znaczników czasu i dodatkowych informacji o tym, gdzie rejestrowanie się. (Aby uzyskać więcej informacji, sprawdź oficjalną dokumentację .)Rejestrowanie wyjątku można wykonać za pomocą funkcji na poziomie modułu w następujący
logging.exception()
sposób:Wynik:
Uwagi:
funkcja
logging.exception()
powinna być wywoływana tylko z modułu obsługi wyjątkówlogging
moduł nie powinien być stosowany wewnątrz uchwytu, aby uniknąć rejestrowaniaRecursionError
(dzięki @PrakharPandey)Alternatywne poziomy dziennika
Możliwe jest także zarejestrowanie wyjątku na innym poziomie dziennika przy użyciu argumentu słowa kluczowego w następujący
exc_info=True
sposób:źródło
Podnoszenie jednego błędu liniowego można wykonać za pomocą instrukcji aser, jeśli to właśnie chcesz zrobić. Pomoże to w pisaniu statycznie naprawialnego kodu i wczesnym sprawdzaniu błędów.
źródło
Można w zasadzie kontrolować, które informacje ze śledzenia mają być wyświetlane / rejestrowane podczas przechwytywania wyjątków.
Kod
wygeneruje następujący ślad:
Wydrukuj / zaloguj pełny ślad
Jak już wspomniano inni, możesz złapać cały traceback za pomocą modułu traceback:
Spowoduje to wygenerowanie następującego wyniku:
Możesz to zrobić, używając rejestrowania:
Wynik:
Drukuj / loguj tylko nazwę błędu / komunikat
Możesz nie być zainteresowany całym procesem śledzenia, ale tylko najważniejszymi informacjami, takimi jak nazwa wyjątku i komunikat wyjątku, użyj:
Wynik:
źródło