在Django中,我如何获取异常消息?
在一个视图函数中,我有这样的代码:
try:
url = request.POST.get('u', '')
if len(url) == 0:
raise ValidationError('Empty URL')
except ValidationError, err:
print err
输出是一个字符串:[u'Empty URL']
当我试着把错误信息传递给我的模板时(放在一个字典里,像这样 { 'error_message': err.value }
),模板成功地收到了这个信息(用 {{ error_message }}
)。
问题是,我得到的字符串和上面的一模一样,还是 [u'Empty URL']
,而且前面还有个 [u'...']
!
我该怎么去掉它呢?
(Python 2.6.5,Django 1.2.4,Xubuntu 10.04)
4 个回答
一种更通用的方法来始终知道消息的位置,就是对你的 err
变量使用 dir
函数,这样可以显示这个对象的所有属性。通过这个列表,你可以推测出消息在哪里。在我的例子中(使用的是 django 3.2),我发现消息字典在一个叫 args
的属性里。所以要使用它(比如用打印输出)
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
如果你是从 django.core.exceptions
导入 ValidationError
,那么你可以直接用 err.messages
来获取错误信息。
https://github.com/django/django/blob/main/django/core/exceptions.py#L124
如果你是从 rest_framework.serializers
导入 ValidationError
,那么这个 ValidationError
没有 messages
这个属性,但有一个叫 detail
的属性。所以你可以用 err.detail
,它会给你一个字典。
如果你想把所有的错误信息合并成一个字符串,可以使用
"".join(["".join(v) for v in err.detail.values()])
或者
"".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
ValidationError
实际上包含了多个错误信息。
当你执行 print err
时,输出结果是 [u'Empty URL']
,这是因为 repr(err.messages)
返回的字符串就是这个(可以查看 ValidationError.__str__
的源代码)。
如果你想从 ValidationError
中打印出一个易于理解的单一错误信息,你可以把错误信息列表连接起来,比如:
# Python 2
print '; '.join(err.messages)
# Python 3
print('; '.join(err.messages))