2010-12-16 20 views
32

W pythonie 2.6.6, w jaki sposób mogę przechwycić komunikat o błędzie wyjątku.Python: Uzyskiwanie komunikatu o błędzie wyjątku

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

to robi wydaje się działać. Otrzymuję:

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

"To robi wydaje się działać." - co powinien robić i czego nie robi? – khachik

+0

Którą wersję Python używasz? – infrared

+0

Witam, zaktualizowałem swoje pytanie. Dzięki – Hellnar

Odpowiedz

28

Najpierw przeprowadź przez str().

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

Należy również pamiętać, że niektóre klasy wyjątków mogą mieć określone atrybuty z dokładnym błędem.

+4

Ale to nie działa w Unicode, prawda? –

4

Wszystko o str jest poprawne, kolejna odpowiedź: instancją Exception ma atrybut message, a może chcesz go używać (jeśli dostosowane IntegrityError nie zrobić coś specjalnego):

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

Atrybut BaseException.message jest przestarzały od czasu wersji Python 2.6. Zobacz: http://stackoverflow.com/questions/1272138/baseexception-message-deprecated-in-python-2-6 – bosgood

3

Powinieneś użyj unicode zamiast string, jeśli zamierzasz przetłumaczyć swoją aplikację.

BTW, Im sprawa używasz json z powodu żądania Ajax, proponuję wysłać błędy z powrotem HttpResponseServerError zamiast 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") 

a następnie zarządzać błędy w procedurze Ajax. Jeśli chcesz, mogę opublikować przykładowy kod.

0

Działa to dla mnie:

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') 
Powiązane problemy