web-dev-qa-db-ja.com

Python:例外のエラーメッセージを取得する

python 2.6.6では、どのように例外のエラーメッセージをキャプチャできますか。

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

これは機能しないようです。私は得る:

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

最初にstr()を介して渡します。

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

また、特定の例外クラスには、正確なエラーを与える特定の属性がある場合があることに注意してください。

strのすべてが正しいが、さらに別の答え:Exceptionインスタンスにはmessage属性があり、それを使用することができます(カスタマイズされたIntegrityErrorが特別なことはしないでください):

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

アプリケーションを翻訳する場合は、unicodeの代わりにstringを使用する必要があります。

ところで、Ajaxリクエストのためにjsonを使用している場合、HttpResponseServerErrorではなく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")

そして、Ajaxプロシージャのエラーを管理します。ご希望の場合は、サンプルコードを投稿できます。

3
Dona

これは私のために働く:

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