开发者

In Django, how can I get an exception's message?

In a view function, I have something like:

try:
    url = request.POST.get('u', '')
    if len(url) == 0:
        raise ValidationError('Empty URL')
except ValidationError, err:
    print err

The output is a string: [u'Empty URL']

When I try to pass the error message to my template 开发者_如何学运维(stuffed in a dict, something like { 'error_message': err.value }), the template successfully gets the message (using {{ error_message }}).

The problem is that I get the exact same string as above, [u'Empty URL'], with the [u'...']!

How do I get rid of that?

(Python 2.6.5, Django 1.2.4, Xubuntu 10.04)


ValidationError actually holds multiple error messages.

The output of print err is [u'Empty URL'] because that is the string returned by repr(err.messages) (see ValidationError.__str__ source code).

If you want to print a single readable message out of a ValidationError, you can concatenate the list of error messages, for example:

    # Python 2 
    print '; '.join(err.messages)
    # Python 3
    print('; '.join(err.messages))


If you are importing ValidationError from django.core.exceptions you can simply use messages method as err.messages.

https://github.com/django/django/blob/main/django/core/exceptions.py#L124

If you are importing ValidationError from rest_framework.serializers , there is no messages property for the ValidationError but there is detail property. so you can use err.detail which will give you a dictionary.

In order to concatenate all the error messages as a string, you can use
"".join(["".join(v) for v in err.detail.values()])
or
"".join([k+" - "+"".join(v) for k,v in err.detail.items()])

https://github.com/encode/django-rest-framework/blob/master/rest_framework/exceptions.py#L143


A more general way to always know where the message is to call the dir function on your err variable to show you all the attribute of this object. from that list you can infer where the messages are, in my case (with django 3.2) i found out that the message dict is in an attribute called args. so to use it (with a print for example)

try:
    url = request.POST.get('u', '')
    if len(url) == 0:
        raise ValidationError('Empty URL')
except ValidationError, err:
    print(err.args) # HERE THE ERROR DICT MESSAGE IS ACCESSIBLE


I fixed it by changing ValidationError to BaseException.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜