¿Cómo obtener el último objeto de excepción después de que se genere un error en un indicador de Python?

Al depurar el código de Python en el indicador interactivo (REPL), a menudo escribo un código que genera una excepción, pero no lo envolví en un try / except , por lo que una vez que surge el error, siempre he perdido el objeto de excepción.

A menudo, la traza y el mensaje de error que imprime Python no son suficientes. Por ejemplo, cuando se busca una URL, el servidor puede devolver un error 40x, y necesita el contenido de la respuesta a través de error.read() … pero ya no tiene el objeto de error. Por ejemplo:

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

Drat, ¿qué decía el cuerpo de la respuesta? Probablemente tenía información de error valiosa en ella …

Me doy cuenta de que generalmente es fácil volver a ejecutar el código envuelto en un bash / excepto, pero eso no es lo ideal. También me doy cuenta de que, en este caso específico, si estuviera usando la biblioteca de requests (que no genera errores HTTP), no tendría este problema … pero realmente me pregunto si hay una manera más general de obtener el último objeto de excepción en un indicador de Python en estos casos.

El módulo sys proporciona algunas funciones para el examen post-hoc de excepciones: sys.last_type , sys.last_value y sys.last_traceback .

sys.last_value es el que estás buscando.

Como mencionó @Cairnarvon, no encontré ningún miembro last_value módulo sys.

sys.exc_info() hizo el truco por mí. sys.exc_info() devuelve una tupla con tres valores (type, value, traceback) .

Así que sys.exc_info()[1] dará el error legible. Aquí está el ejemplo,

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

Saldrá el list assignment index out of range

Además, traceback.format_exc() del módulo de traceback se puede utilizar para imprimir la información similar.

A continuación se muestra la salida si se usa fortmat_exec() ,

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