在Django中,我如何获取异常消息?

18 投票
4 回答
19972 浏览
提问于 2025-04-16 09:53

在一个视图函数中,我有这样的代码:

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 个回答

0

一种更通用的方法来始终知道消息的位置,就是对你的 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

0

如果你是从 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

25

ValidationError 实际上包含了多个错误信息。

当你执行 print err 时,输出结果是 [u'Empty URL'],这是因为 repr(err.messages) 返回的字符串就是这个(可以查看 ValidationError.__str__ 的源代码)。

如果你想从 ValidationError 中打印出一个易于理解的单一错误信息,你可以把错误信息列表连接起来,比如:

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

撰写回答