向自定义异常添加额外信息

时间:2008-09-07 20:50:01

标签: c# .net exception elmah

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

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

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

6 个答案:

答案 0 :(得分:11)

  

在自定义例外情况中,例如   该额外的响应数据应该如何   进入例外“消息”?

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

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,则无需进一步操作即可记录信息。唯一的问题是记录的详细信息将是非结构化文本。

答案 1 :(得分:6)

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

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

  

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

     

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

     

[..]

     

对继承人的说明:

     

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

     

应该本地化错误消息。

响应数据不符合描述。

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

答案 2 :(得分:5)

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

答案 3 :(得分:1)

我并不完全理解这个问题,但您似乎在询问如何处理其他异常数据,如果这不是您的问题,请随意忽略这一点。

我认为要问的一个重要问题是什么是异常消息?它不是为了知道异常的来源,堆栈跟踪就是为了这个;它不是将一个异常封装在一个更普遍的异常中,应该用InnerException字段来完成;如果您的异常只是从代码中的某个特定位置引发的,那么甚至不能描述您所遇到的错误类型 - 这就是异常的类型。

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

所以,据我了解你的问题,我认为存储从另一个系统收到的这些“附加信息”的最佳方式是InnerException。我不认识Elmah,但是如果它值得它的盐,它将检查InnerExceptions并存储它们。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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