代码之家  ›  专栏  ›  技术社区  ›  Leopd

在django中引发自定义异常时,异常值字段为空

  •  1
  • Leopd  · 技术社区  · 16 年前

    我在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 value 字段自 sys.exc_info() 它始终被简洁地记录为“[异常的]关联值或要引发的第二个参数,如果异常类型是类对象,则始终是类实例。”不幸的是,我不知道如何处理这些信息。

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   AdmiralNemo    16 年前

    我只想用 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)
    

        2
  •  1
  •   Ned Batchelder    16 年前

    @上将是对的:让基类来做这项工作。

    但要更深入地研究代码,问题是您根本就没有绑定到异常实现中。异常将存储在.message属性中,而不是.msg。它还将其存储为.args属性中的(s,)。您的代码没有设置这两个属性,这可能就是Django找不到要显示的消息的原因。

    __str__ self.msg repr(self.msg) ,这将在字符串周围添加引号,并可能在文本中转义。