Risposte:
Per Python 2.6 e versioni successive e Python 3.x:
except Exception as e: print(e)
Per Python 2.5 e precedenti, utilizzare:
except Exception,e: print str(e)
str( KeyError('bad'))
=> 'bad'
- non indica il tipo di eccezione
print(repr(e))
; l' Exception.__str__
implementazione di base restituisce solo il messaggio di eccezione, non il tipo. In alternativa, utilizzare il traceback
modulo, che dispone di metodi per stampare l'eccezione corrente, formattata o il traceback completo.
Il traceback
modulo fornisce metodi per la formattazione e la stampa delle eccezioni e dei loro traceback, ad es. Ciò stamperebbe un'eccezione come il gestore predefinito fa:
import traceback
try:
1/0
except Exception:
traceback.print_exc()
Produzione:
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()
funzione e la traceback.print_exc()
funzione la ottiene da lì. Dovresti sempre inserire un'eccezione esplicitamente quando non gestisci un'eccezione o quando vuoi mostrare informazioni basate su un'eccezione diversa.
In Python 2.6 o versioni successive è un po 'più pulito:
except Exception as e: print(e)
Nelle versioni precedenti è ancora abbastanza leggibile:
except Exception, e: print e
Nel caso in cui si desideri passare stringhe di errori, ecco un esempio da Errori ed eccezioni (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
(Stavo per lasciare questo come commento sulla risposta di @jldupont, ma non ho abbastanza reputazione.)
Ho visto risposte come la risposta di @jldupont anche in altri luoghi. FWIW, penso che sia importante notare che questo:
except Exception as e:
print(e)
stamperà l'output dell'errore per sys.stdout
impostazione predefinita. Un approccio più appropriato alla gestione degli errori in generale sarebbe:
except Exception as e:
print(e, file=sys.stderr)
(Nota che devi farlo import sys
funzionare.) In questo modo, l'errore viene stampato STDERR
invece diSTDOUT
, il che consente l'analisi dell'output / reindirizzamento / etc. Comprendo che la domanda riguardava strettamente la "stampa di un errore", ma sembra importante indicare qui le migliori pratiche piuttosto che tralasciare questo dettaglio che potrebbe portare a un codice non standard per chiunque alla fine non apprenda meglio.
Non ho usato il traceback
modulo come nella risposta di Cat Plus Plus, e forse è il modo migliore, ma ho pensato di buttarlo lì.
logging
Invece di utilizzare la print()
funzione di base , logging
è possibile utilizzare il modulo più flessibile per registrare l'eccezione. Il logging
modulo offre molte funzionalità extra, ad esempio la registrazione dei messaggi in un determinato file di registro, la registrazione dei messaggi con timestamp e ulteriori informazioni su dove è avvenuta la registrazione. (Per maggiori informazioni consulta la documentazione ufficiale .)
La registrazione di un'eccezione può essere eseguita con la funzione a livello di modulo in questo logging.exception()
modo:
import logging
try:
1/0
except BaseException:
logging.exception("An exception was thrown!")
Produzione:
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
Appunti:
la funzione logging.exception()
deve essere chiamata solo da un gestore eccezioni
il logging
modulo non deve essere utilizzato all'interno di un gestore di registrazione per evitare un RecursionError
(grazie a @PrakharPandey)
È anche possibile registrare l'eccezione con un altro livello di registro utilizzando l'argomento della parola chiave in questo exc_info=True
modo:
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)
Uno ha praticamente il controllo su quali informazioni del traceback devono essere visualizzate / registrate quando si rilevano delle eccezioni.
Il codice
with open("not_existing_file.txt", 'r') as text:
pass
produrrebbe il seguente traceback:
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'
Come già menzionato da altri, puoi catturare l'intero traceback usando il modulo traceback:
import traceback
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
traceback.print_exc()
Ciò produrrà il seguente output:
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'
Puoi ottenere lo stesso risultato utilizzando la registrazione:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
logger.error(exception, exc_info=True)
Produzione:
__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'
Potresti non essere interessato all'intero traceback, ma solo alle informazioni più importanti, come Nome eccezione e Messaggio eccezione, utilizzare:
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))
Produzione:
Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'