2010-12-16 16 views
32

En Python 2.6.6, ¿cómo puedo capturar el mensaje de error de una excepción?Python: Obteniendo el mensaje de error de una excepción

IE:

response_dict = {} # contains info to response under a django view. 
try: 
    plan.save() 
    response_dict.update({'plan_id': plan.id}) 
except IntegrityError, e: #contains my own custom exception raising with custom messages. 
    response_dict.update({'error': e}) 
return HttpResponse(json.dumps(response_dict), mimetype="application/json") 

Esto no se parece a trabajar. Obtengo:

IntegrityError('Conflicts are not allowed.',) is not JSON serializable 
+1

"Esto no se parece a trabajar." - ¿Qué debería hacer y qué no? – khachik

+0

¿Qué versión de Python estás usando? – infrared

+0

Hola, he actualizado mi pregunta. Gracias – Hellnar

Respuesta

28

Primero páselo por str().

response_dict.update({'error': str(e)}) 

También tenga en cuenta que ciertas clases de excepción pueden tener atributos específicos que dan el error exacto.

+4

Pero eso falla para Unicode, ¿no? –

4

Todo sobre str es correcto, sin embargo, otra respuesta: una instancia Exception tiene message atributo, y es posible que desee utilizar (si su medida IntegrityError no hacer algo especial):

except IntegrityError, e: #contains my own custom exception raising with custom messages. 
    response_dict.update({'error': e.message}) 
+12

El atributo BaseException.message ha quedado obsoleto desde Python 2.6. Ver: http://stackoverflow.com/questions/1272138/baseexception-message-deprecated-in-python-2-6 – bosgood

3

Usted debe use unicode en lugar de string si va a traducir su aplicación.

Por cierto, Im caso de que esté usando JSON a causa de una petición Ajax, te sugiero que enviar de vuelta con errores HttpResponseServerError en lugar de HttpResponse:

from django.http import HttpResponse, HttpResponseServerError 
response_dict = {} # contains info to response under a django view. 
try: 
    plan.save() 
    response_dict.update({'plan_id': plan.id}) 
except IntegrityError, e: #contains my own custom exception raising with custom messages. 
    return HttpResponseServerError(unicode(e)) 

return HttpResponse(json.dumps(response_dict), mimetype="application/json") 

y luego administrar errores en el procedimiento de Ajax. Si lo desea, puedo publicar un código de muestra.

0

Esto funciona para mí:

def getExceptionMessageFromResponse(oResponse): 
    # 
    ''' 
    exception message is burried in the response object, 
    here is my struggle to get it out 
    ''' 
    # 
    l = oResponse.__dict__['context'] 
    # 
    oLast = l[-1] 
    # 
    dLast = oLast.dicts[-1] 
    # 
    return dLast.get('exception') 
Cuestiones relacionadas