抛出自定义异常时Django的异常值字段为空
我在我的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标准的漂亮堆栈跟踪页面。但是,我从来没有看到我的错误信息——“情况不妙”这个信息在调试错误页面上从未出现过。
看起来这些信息应该作为错误页面上的异常值
显示。我查阅了Django的源代码,发现这实际上是sys.exc_info()
中的value
字段,而这个字段的文档描述得很简洁:“[异常的]相关值或抛出的第二个参数,如果异常类型是类对象,这个值总是一个类实例。”可惜的是,我不知道该如何利用这些信息。
所以我的问题是:我应该如何编写和抛出我的自定义异常,以便在像Django错误屏幕这样的地方显示更有用的数据呢?
2 个回答
1
@AdmiralNemo说得对:让基类来处理这些事情。
不过我们再深入看看你的代码,问题在于你根本没有使用异常(Exception)的实现。异常会把信息存储在.message这个属性里,而不是.msg。它还会把信息以(s,)的形式存储在.args这个属性里。你的代码没有设置这两个属性,这可能就是为什么Django找不到要显示的信息。
另外,你的__str__
方法有点奇怪。它应该返回self.msg
,而不是repr(self.msg)
,后者会在字符串周围加上引号,并可能会对文本中的某些字符进行转义。
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 环境中测试了一下,这样做能正确显示我传给异常构造函数的消息,如果没有传消息,就会显示默认的消息。