【问题标题】:Adding extra information to a custom exception向自定义异常添加额外信息
【发布时间】:2010-09-08 02:32:30
【问题描述】:

我为一个可能出错的非常具体的问题创建了一个自定义异常。我从另一个系统接收数据,如果它在尝试解析该数据时发生爆炸,我会引发异常。在我的自定义异常中,我添加了一个名为“ResponseData”的字段,因此我可以准确跟踪我的代码无法处理的内容。

在这样的自定义异常中,额外的响应数据是否应该进入异常“消息”?如果它去那里,信息可能是巨大的。我有点想要它,因为我正在使用 Elmah,这就是我可以获取这些数据的方式。

所以问题是: - 如何让 Elmah 在自定义异常中记录来自字段的额外信息 要么 - 额外的异常细节是否应该进入“消息”属性?

【问题讨论】:

    标签: c# .net exception elmah


    【解决方案1】:

    在诸如此类的自定义异常中, 如果额外的响应数据去 进入异常“消息”?

    不,就像Sören already pointed out。但是,您的异常类型可以覆盖ToString 并明智地在其中添加响应数据信息。这是一种完全正常的做法,BCL(基类库)中的许多异常类型都遵循这种做法,因此您不会发现自己逆流而上。例如,看看SSCLI (Rotor) 中的System.IO.FileNotFoundException.ToString 实现:

    public override String ToString()
    {
        String s = GetType().FullName + ": " + Message;
    
        if (_fileName != null && _fileName.Length != 0)
            s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName);
    
        if (InnerException != null)
            s = s + " ---> " + InnerException.ToString();
    
        if (StackTrace != null)
            s += Environment.NewLine + StackTrace;
    
        try
        {
            if(FusionLog!=null)
            {
                if (s==null)
                    s=" ";
                s+=Environment.NewLine;
                s+=Environment.NewLine;
                s+="Fusion log follows: ";
                s+=Environment.NewLine;
                s+=FusionLog;
            }
        }
        catch(SecurityException)
        {
    
        }
        return s;
    }
    

    如您所见,它附加了FusionLog 属性的内容,表示在程序集加载失败的情况下额外信息。

    我怎样才能让 Elmah 录制额外的 来自自定义字段的信息 异常

    ELMAH 将在异常上调用ToString 的结果存储为错误的详细信息,因此如果您按照规定实施了ToString,则无需进一步工作即可记录信息。唯一的问题是记录的详细信息将是非结构化文本。

    【讨论】:

      【解决方案2】:

      您不应该在.Message 中填写调试信息,而应使用简洁、有用的一段文字。

      http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

      Message 的文本应完整描述错误,并应尽可能说明如何纠正错误。 Message 属性的值包含在 ToString 返回的信息中。

      Message 属性仅在创建异常时设置。如果没有为当前实例的构造函数提供消息,则系统会提供一条使用当前系统文化格式化的默认消息。

      [..]

      继承人须知:

      Message 属性在需要控制消息内容或格式的类中被覆盖。应用程序代码通常在需要显示有关已捕获的异常的信息时访问此属性。

      错误信息应该本地化。

      响应数据不能作为描述。

      不熟悉 elmah,我无法告诉您如何在使用时扩展 Exception 类。 elmah 是否将自己的子类实现为Exception?还是接口?你可以自己继承它吗?

      【讨论】:

        【解决方案3】:

        Exception 类包含一个字典(我相信名为 Data),您可以使用它来将自定义数据与普通异常相关联。

        【讨论】:

        • 请记住,如果异常被序列化,则其中的所有内容也需要可序列化 - 因此,如果您的对象很复杂,最好只提取您需要的内容
        【解决方案4】:

        我不完全理解这个问题,但你似乎在问如何处理额外的异常数据,如果这不是你的问题,请随意忽略这个。

        我认为要问的一个重要问题是异常消息的确切用途是什么?这不是为了知道异常来自哪里,堆栈跟踪是为了知道;它不是将异常封装在更通用的异常中,应该使用 InnerException 字段来完成;如果您的异常仅从代码中的特定位置引发,则它甚至不用于描述您遇到的错误类型 - 这就是异常的类型。

        通常我使用消息字段来提供简单的、人类可读的提示,不是我的程序员第一次看到这个错误可以用来了解底层系统。我认为 message 字段适合简短(一句话)解释、有关此错误如何频繁出现的提示或进一步阅读的参考。

        因此,据我了解您的问题,我认为存储从另一个系统接收到的“附加信息”的最佳方式是作为 InnerException。我不认识 Elmah,但如果值得一提,它会检查 InnerExceptions 并存储它们。

        【讨论】:

          【解决方案5】:

          我不明白这个问题——您正在扩展 System.Exception,并且您已经添加了 Elmah 字段。这就是它所属的地方——作为异常本身的公共属性。

          【讨论】:

            【解决方案6】:

            Elmah 是一个记录未处理异常的 http 模块。

            我猜这只是 Elmah 的一个限制,因为它不存储自定义字段。我想我得问问那些家伙。我有额外的字段用于响应数据,但 Elmah 没有存储它。

            【讨论】:

              猜你喜欢
              • 2012-12-12
              • 2014-01-19
              • 1970-01-01
              • 2011-08-29
              • 2017-05-26
              • 1970-01-01
              • 1970-01-01
              • 2022-11-27
              • 1970-01-01
              相关资源
              最近更新 更多