Risposte:
uso str
try:
some_method()
except Exception as e:
s = str(e)
Inoltre, la maggior parte delle classi di eccezioni avrà un args
attributo. Spesso, args[0]
verrà visualizzato un messaggio di errore.
Va notato che l'utilizzo di solo str
restituirà una stringa vuota se non ci sono messaggi di errore, mentre l'utilizzo repr
come 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?
e.message
perché args[0]
potrebbe non essere in realtà un messaggio.
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)
.
str
(o anche unicode
o .format
) ha causato bug a causa della gestione Unicode. Se non si ha il controllo completo del contenuto del messaggio di errore, utilizzare SEMPRE repr
per evitare errori Unicode imprevisti.
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
repr
è utile grazie, sembra altro unicode
, str
che codifica, ... potrebbe sollevare un'eccezione seconda ingresso. Non del tutto utile quando si cerca di mantenere l'eccezione, ma exception-safe
sembra che sia la
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".
Anche se mi rendo conto che questa è una vecchia domanda, vorrei suggerire di utilizzare il traceback
modulo 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.
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 u
comando 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.args
e str(e)
dipendere dalle tue esigenze (e possibilmente e.message
se 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")'
Per python2, è meglio usare e.message
per ottenere il messaggio di eccezione, questo eviterà possibile UnicodeDecodeError
. Ma sì e.message
sarà vuoto per qualche tipo di eccezione OSError
, nel qual caso possiamo aggiungere un exc_info=True
alla nostra funzione di registrazione per non perdere l'errore.
Per python3, penso che sia sicuro da usare str(e)
.
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}