Odpowiedzi:
W przypadku Python 2.6 i nowszych oraz Python 3.x:
except Exception as e: print(e)
W przypadku Python 2.5 i wcześniejszych użyj:
except Exception,e: print str(e)
str( KeyError('bad'))
=> 'bad'
- nie określa typu wyjątku
print(repr(e))
; podstawowa Exception.__str__
implementacja zwraca tylko komunikat wyjątku, a nie typ. Lub użyj traceback
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:
import traceback
try:
1/0
except Exception:
traceback.print_exc()
Wynik:
Traceback (most recent call last):
File "C:\scripts\divide_by_zero.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
error_message = traceback.format_exc()
except Exception as ex:
...
sys.exc_info()
funkcji i traceback.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:
except Exception as e: print(e)
W starszych wersjach jest nadal dość czytelny:
except Exception, e: print e
Jeśli chcesz przekazać ciągi błędów, oto przykład z błędów i wyjątków (Python 2.6)
>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print type(inst) # the exception instance
... print inst.args # arguments stored in .args
... print inst # __str__ allows args to printed directly
... x, y = inst # __getitem__ allows args to be unpacked directly
... print 'x =', x
... print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
(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:
except Exception as e:
print(e)
sys.stdout
domyślnie wypisze wyjście błędu . Bardziej odpowiednie podejście do obsługi błędów ogólnie byłoby:
except Exception as e:
print(e, file=sys.stderr)
(Pamiętaj, że musisz to zrobić, aby import sys
to zadziałało). W ten sposób błąd jest wypisywany STDERR
zamiast STDOUT
, 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ę.
logging
Zamiast korzystać z print()
funkcji podstawowej , logging
można użyć bardziej elastycznego modułu do zarejestrowania wyjątku. Do logging
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:
import logging
try:
1/0
except BaseException:
logging.exception("An exception was thrown!")
Wynik:
ERROR:root:An exception was thrown!
Traceback (most recent call last):
File ".../Desktop/test.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
Uwagi:
funkcja logging.exception()
powinna być wywoływana tylko z modułu obsługi wyjątków
logging
moduł nie powinien być stosowany wewnątrz uchwytu, aby uniknąć rejestrowania RecursionError
(dzięki @PrakharPandey)
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:
logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)
Można w zasadzie kontrolować, które informacje ze śledzenia mają być wyświetlane / rejestrowane podczas przechwytywania wyjątków.
Kod
with open("not_existing_file.txt", 'r') as text:
pass
wygeneruje następujący ślad:
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
Jak już wspomniano inni, możesz złapać cały traceback za pomocą modułu traceback:
import traceback
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
traceback.print_exc()
Spowoduje to wygenerowanie następującego wyniku:
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
Możesz to zrobić, używając rejestrowania:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
logger.error(exception, exc_info=True)
Wynik:
__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
File "exception_checks.py", line 27, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
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:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
print("Exception: {}".format(type(exception).__name__))
print("Exception message: {}".format(exception))
Wynik:
Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'