Ottenere il valore dell'eccezione in Python


239

Se ho quel codice:

try:
    some_method()
except Exception, e:

Come posso ottenere questo valore di eccezione (rappresentazione stringa intendo)?

Risposte:


323

uso str

try:
    some_method()
except Exception as e:
    s = str(e)

Inoltre, la maggior parte delle classi di eccezioni avrà un argsattributo. Spesso, args[0]verrà visualizzato un messaggio di errore.

Va notato che l'utilizzo di solo strrestituirà una stringa vuota se non ci sono messaggi di errore, mentre l'utilizzo reprcome raccomandato da pyfunc mostrerà almeno la classe dell'eccezione. La mia opinione è che se lo stampi, è per un utente finale a cui non importa quale sia la classe e vuole solo un messaggio di errore.

Dipende davvero dalla classe di eccezione con cui hai a che fare e da come viene istanziata. Avevi in ​​mente qualcosa in particolare?


Sto stampando questo per fare un rapporto, la str (e) va bene immagino. Grazie mille
Frias,

8
Preferirei usare e.messageperché args[0]potrebbe non essere in realtà un messaggio.
Cedbeu,

3
repr (e) è utile anche se si desidera ottenere l'eccezione completa (ad esempio NameError ("nome globale 'variabile' non è definito",), invece di "nome globale 'variabile" non è definito "
Ben Morris,

49
questa risposta è pericoloso, come fallirà per le eccezioni unicode come questo: raise Exception(u'jörn'). L'errore è particolarmente grave, perché non vedrai mai l'eccezione effettiva ma solo a UnicodeDecodeError. Se non conosci la codifica dell'eccezione (e la maggior parte delle volte non lo fai), dovresti lavorare repr(e)o, se necessario, utilizzare un altro blocco try-tranne nella gestione delle eccezioni che intercetta UnicodeDecodeErrors e ricade su repr(e).
Jörn Hees,

11
Concordo con @ JörnHees. Non riesco a contare il numero di volte che str(o anche unicodeo .format) ha causato bug a causa della gestione Unicode. Se non si ha il controllo completo del contenuto del messaggio di errore, utilizzare SEMPRE reprper evitare errori Unicode imprevisti.
Kenny Trytek,

186

Usa repr () e La differenza tra usare repr e str

Utilizzando repr:

>>> try:
...     print(x)
... except Exception as e:
...     print(repr(e))
... 
NameError("name 'x' is not defined")

Utilizzando str:

>>> try:
...     print(x)
... except Exception as e:
...     print(str(e))
... 
name 'x' is not defined

2
ah, reprè utile grazie, sembra altro unicode, strche codifica, ... potrebbe sollevare un'eccezione seconda ingresso. Non del tutto utile quando si cerca di mantenere l'eccezione, ma exception-safesembra che sia la
repr

2
Questo è molto meglio di qualsiasi str()soluzione simile, perché include effettivamente il tipo di eccezione. Con str()ho ottenuto 'status'mentre con repr()ho ottenuto KeyError('status')ed ero tipo "aaaaah, ora capisco l'errore".
jlh

27

Anche se mi rendo conto che questa è una vecchia domanda, vorrei suggerire di utilizzare il tracebackmodulo per gestire l'output delle eccezioni.

Utilizzare traceback.print_exc()per stampare l'eccezione corrente all'errore standard, proprio come verrebbe stampato se non fosse rilevata o traceback.format_exc()per ottenere lo stesso output di una stringa. È possibile passare vari argomenti a una di queste funzioni se si desidera limitare l'output o reindirizzare la stampa a un oggetto simile a un file.


23

Un altro modo non è stato ancora dato:

try:
    1/0
except Exception, e:
    print e.message

Produzione:

integer division or modulo by zero

args[0] potrebbe in realtà non essere un messaggio.

str(e)potrebbe restituire la stringa con le virgolette circostanti e possibilmente con il ucomando unicode se:

'integer division or modulo by zero'

repr(e) fornisce la rappresentazione di eccezione completa che probabilmente non è ciò che si desidera:

"ZeroDivisionError('integer division or modulo by zero',)"

modificare

Colpa mia !!! Sembra che BaseException.message sia stato deprecato2.6 , infine, sembra che non esista ancora un modo standardizzato per visualizzare i messaggi di eccezione. Quindi immagino che la cosa migliore sia occuparsi e.argse str(e)dipendere dalle tue esigenze (e possibilmente e.messagese la lib che stai usando si basa su quel meccanismo).

Ad esempio, con pygraphviz, e.messageè l'unico modo per visualizzare correttamente l'eccezione, utilizzando str(e)circonderà il messaggio con u''.

Ma con MySQLdb, il modo corretto di recuperare il messaggio è e.args[1]: e.messageè vuoto e str(e)verrà visualizzato'(ERR_CODE, "ERR_MSG")'


0

Per python2, è meglio usare e.messageper ottenere il messaggio di eccezione, questo eviterà possibile UnicodeDecodeError. Ma sì e.messagesarà vuoto per qualche tipo di eccezione OSError, nel qual caso possiamo aggiungere un exc_info=Truealla nostra funzione di registrazione per non perdere l'errore.
Per python3, penso che sia sicuro da usare str(e).


0

Se non conosci il tipo / origine dell'errore, puoi provare:

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

Ma attenzione, riceverai un avviso pep8:

[W] PEP 8 (E722): do not use bare except

0

Per controllare il messaggio di errore e fare qualcosa con esso (con Python 3) ...

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}
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.