Risposte:
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?
e.messageperché 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 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.
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, 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
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 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.
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")'
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).
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}