我的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错误屏幕等地方显示更多有用的数据?
答案 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)
,它会在字符串周围添加引号,并且可能会在文本内部转义。