11

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

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

所以问题是: - 我怎样才能让 Elmah 记录自定义异常中字段的额外信息或者 - 额外的异常详细信息是否应该进入“消息”属性?

4

6 回答 6

12

在诸如此类的自定义异常中,是否应该将额外的响应数据放入异常“消息”中?

不,正如Sören 已经指出的那样。但是,您的异常类型可以覆盖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按规定实施,则无需进一步工作即可记录信息。唯一的问题是记录的详细信息将是非结构化文本。

于 2008-09-30T23:43:45.000 回答
6

您不应填写.Message调试信息,而应填写简洁、有用的文本。

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

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

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

[..]

继承人注意事项:

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

错误消息应该本地化。

响应数据不能作为描述。

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

于 2008-09-07T21:14:13.967 回答
5

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

于 2008-09-30T23:59:39.953 回答
1

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

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

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

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

于 2008-09-07T21:21:59.767 回答
0

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

于 2008-09-07T21:03:26.753 回答
0

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

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

于 2008-09-07T21:22:59.687 回答