2013-03-25 15 views
31

Quando eseguo il debug di codice Python al prompt interattivo (REPL), spesso scriverò del codice che solleva un'eccezione, ma non l'ho avvolto in un try/except, quindi una volta che l'errore è stato generato, ho per sempre ha perso l'oggetto eccezione.Come ottenere l'ultimo oggetto eccezione dopo che è stato generato un errore su un prompt Python?

Spesso il traceback e il messaggio di errore che Python stampa non è sufficiente. Ad esempio, quando si recupera un URL, il server potrebbe restituire un errore 40x e sarà necessario il contenuto della risposta tramite error.read() ... ma non si ha più l'oggetto errore. Ad esempio:

>>> import urllib2 
>>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    ... 
urllib2.HTTPError: HTTP Error 400: Bad Request 

Drat, che cosa ha detto il corpo della risposta? Probabilmente aveva informazioni preziose sull'errore ...

Mi rendo conto che di solito è facile rieseguire il codice avvolto in una prova/eccetto, ma non è l'ideale. Mi rendo anche conto che in questo caso specifico se stavo usando la libreria requests (che non genera errori HTTP), non avrei questo problema ... ma mi chiedo davvero se c'è un modo più generale per ottenere l'ultimo oggetto di eccezione al prompt di Python in questi casi.

risposta

44

Il modulo sys fornisce alcune funzioni per l'esame post-hoc delle eccezioni: sys.last_type, sys.last_value e sys.last_traceback.

sys.last_value è quello che stai cercando.

+1

Molto bello, grazie! Funziona come documentato. Strano che la mia ricerca su Google non l'abbia trovato, ma vabbè. (Nonostante sia uno sviluppatore Python abbastanza esperto, imparo qualcosa su Python o sulle sue librerie standard ogni giorno ...) –

+0

@BenHoyt FYI, secondo la documentazione di 'sys'," Questi tre sono disponibili solo in una sessione interattiva dopo un il traceback è stato stampato. ". – satoru

+1

@satoru Bene, ovviamente. In un programma normale, un'eccezione non gestita interromperà il programma. – Cairnarvon

4

Come @Cairnarvon menzionato, non ho trovato alcun membro last_value modulo sys.

sys.exc_info() ha fatto il trucco per me. sys.exc_info() restituisce una tupla con tre valori (type, value, traceback).

Quindi sys.exc_info()[1] darà l'errore leggibile. Ecco l'esempio,

import sys 
list = [1,2,3,4] 
try: 
    del list[8] 
except Exception: 
    print(sys.exc_info()[1]) 

uscita volontà list assignment index out of range

Inoltre, traceback.format_exc() dal modulo traceback può essere utilizzato per stampare le informazioni simili.

Di seguito è riportato l'uscita se fortmat_exec() viene utilizzato,

Traceback (most recent call last): File "python", line 6, in <module> IndexError: list assignment index out of range

Problemi correlati