2010-12-16 3 views
32

En python 2.6.6, comment puis-je capturer le message d'erreur d'une exception.Python: obtention du message d'erreur d'une exception

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") 

Cela ne marche pas semble fonctionner. Je reçois:

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

"Cela ne marche pas semblent fonctionner." - Que devrait-il faire et ne pas faire? – khachik

+0

Quelle version de Python utilisez-vous? – infrared

+0

Bonjour, j'ai mis à jour ma question. Merci – Hellnar

Répondre

28

Passez d'abord par str().

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

Notez également que certaines classes d'exception peuvent avoir des attributs spécifiques qui donnent l'erreur exacte.

+4

Mais cela échoue pour unicode, non? –

4

Tout str est correct, mais une autre réponse: une Exception instance a message attribut, et vous pouvez l'utiliser (si votre mesure IntegrityError ne fait pas quelque chose de spécial):

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

L'attribut BaseException.message est obsolète depuis Python 2.6. Voir: http://stackoverflow.com/questions/1272138/baseexception-message-deprecated-in-python-2-6 – bosgood

3

Vous devriez utilisez unicode au lieu de string si vous voulez traduire votre application.

BTW, Im si vous utilisez JSON en raison d'une requête Ajax, je vous suggère d'envoyer des erreurs de retour avec HttpResponseServerError plutôt que 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") 

et gérer les erreurs dans votre procédure Ajax. Si vous souhaitez, je peux poster un exemple de code.

0

Cela fonctionne pour moi:

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') 
Questions connexes