Come stampare un'eccezione in Python?


Risposte:


1064

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)

41
str( KeyError('bad'))=> 'bad'- non indica il tipo di eccezione
Dave,

10
print (e) su keyerror sembra fornire solo la chiave, ma non il messaggio di eccezione completo, che è meno utile.
Veggiet,

14
Se hai intenzione di stampare l'eccezione, è meglio usarla print(repr(e)); l' Exception.__str__implementazione di base restituisce solo il messaggio di eccezione, non il tipo. In alternativa, utilizzare il tracebackmodulo, che dispone di metodi per stampare l'eccezione corrente, formattata o il traceback completo.
Martijn Pieters

453

Il tracebackmodulo 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

4
c'è una sorta di chiamata get_error_message che posso stampare visto che sto usando la mia routine di stampa per aggiungere altre cose.
MikeSchem,

11
@MikeSchem error_message = traceback.format_exc()
heyzling

3
Grazie, questo è quello che volevo. Tutta la traccia, non solo il tipo di errore e il messaggio
Ken Bellows,

Questo frammento non utilizza l'oggetto eccezione catturato. Puoi espandere il codice per usare 'ex'? - come in except Exception as ex:...
aaronsteers il

@aaronsteers utilizza l'eccezione acquisita; in un gestore di eccezioni l'eccezione corrente è disponibile tramite la 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.
Martijn Pieters

169

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

15
In python3, è necessario utilizzare il 1 ° modo, con "as".
Sam Watkins,

53

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

38

(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.stdoutimpostazione 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 sysfunzionare.) In questo modo, l'errore viene stampato STDERRinvece 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 tracebackmodulo come nella risposta di Cat Plus Plus, e forse è il modo migliore, ma ho pensato di buttarlo lì.


1
Suggerirei di aggiungere ulteriormente flush = True. Ho notato con systemd (e non utilizzando un framework di registrazione adeguato), che il buffering durante l'acquisizione nel journal non è quello che mi sarei aspettato.
Cameron Kerr,

20

Python 3: logging

Invece di utilizzare la print()funzione di base , loggingè possibile utilizzare il modulo più flessibile per registrare l'eccezione. Il loggingmodulo 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 loggingmodulo non deve essere utilizzato all'interno di un gestore di registrazione per evitare un RecursionError(grazie a @PrakharPandey)


Livelli di registro alternativi

È anche possibile registrare l'eccezione con un altro livello di registro utilizzando l'argomento della parola chiave in questo exc_info=Truemodo:

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)

1
Non deve essere utilizzato all'interno di un gestore di registrazione per evitare RecursionError
Prakhar Pandey,

4

Se si vuole fare un errore di linea, è possibile eseguire le dichiarazioni di asserzione. Questo ti aiuterà a scrivere codice risolvibile staticamente e a controllare gli errori in anticipo.

assert type(A) is type(""), "requires a string"

2

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'

Stampa / registra il traceback completo

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'

Stampa / registra solo nome errore / messaggio

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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.