在django中抛出自定义异常时,异常值字段为空

时间:2010-07-20 00:49:24

标签: python django exception-handling

我的django项目中有自定义异常,如下所示:

class CustomFooError(Exception):

    def __init__(self, msg="Something went wrong with Foo."):
        self.msg = msg

    def __str__(self):
        return repr(self.msg) 

在我的代码中的不同点,我会引发这样的异常:

raise CustomFooError("Things are going badly")

当Django捕获这些错误时,在调试模式下,我得到了django的标准漂亮堆栈跟踪页面。但我从来没有看到我的错误消息 - “事情变得糟糕”从未出现在调试错误页面中。

它们似乎应该在错误页面上显示为Exception Value。我走回django源远远足以发现这是来自value的{​​{1}}字段,它始终简洁地记录为“[异常]相关值或第二个引发的参数,这是如果异常类型是一个类对象,它总是一个类实例。“不幸的是,我不知道如何处理这些信息。

所以我的问题是:我应该如何编写和提高我的自定义异常,以便在django错误屏幕等地方显示更多有用的数据?

2 个答案:

答案 0 :(得分:3)

我只想使用super并让Exception的构造函数处理msg属性:

class CustomFooError(Exception):

    def __init__(self, msg=None):
        if msg is None:
            msg = 'Something went wrong with Foo.'
        super(CustomFooError, self).__init__(msg)

我刚刚在Django环境中对此进行了测试,它正确地显示了我传递给异常构造函数的消息,如果传递了None,则显示默认消息。

答案 1 :(得分:1)

@AdmiralNemo是对的:让基类完成工作。

但是为了深入挖掘你的代码,问题在于你根本没有与Exception实现相关联。异常将s存储在.message属性中,而不是.msg。它还将它作为(s,)存储在.args属性中。您的代码不会设置这些属性,这可能是Django无法找到要显示的消息的原因。

此外,您的__str__方法很奇怪。它应该返回self.msg,而不是repr(self.msg),它会在字符串周围添加引号,并且可能会在文本内部转义。