web-dev-qa-db-fra.com

Python: Obtention du message d'erreur d'une exception

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

C'EST À DIRE:

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 semble pas fonctionner. Je reçois:

IntegrityError('Conflicts are not allowed.',) is not JSON serializable
33
Hellnar

Passez-le d'abord par str().

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

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

30

Tout ce qui concerne str est correct, encore une autre réponse: une instance Exception a l'attribut message et vous pourrez l'utiliser (si votre IntegrityError personnalisé 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})
4
khachik

Vous devez utiliser unicode au lieu de string si vous souhaitez traduire votre application.

Au fait, si vous utilisez json à cause d'une requête Ajax, je vous suggère de renvoyer les erreurs 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")

puis gérez les erreurs dans votre procédure Ajax .. Si vous le souhaitez, je peux publier un exemple de code.

3
Don

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' )
0
Rick Graves