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.
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 ...) –
@BenHoyt FYI, secondo la documentazione di 'sys'," Questi tre sono disponibili solo in una sessione interattiva dopo un il traceback è stato stampato. ". – satoru
@satoru Bene, ovviamente. In un programma normale, un'eccezione non gestita interromperà il programma. – Cairnarvon