向自定义异常添加其他信息
我为可能会出错的非常具体的问题创建了一个自定义例外。我从另一个系统接收数据,如果在尝试解析该数据时炸弹,则会引发异常。在我的自定义例外中,我添加了一个名为" ResponseData"的字段,因此我可以准确地跟踪我的代码无法处理的内容。
在诸如此类的自定义异常中,是否应将额外的响应数据放入异常"消息"中?如果到那儿,信息可能会很巨大。我有点想要它的地方,因为我正在使用Elmah,这就是我可以得到这些数据的方式。
所以问题是:
我如何让Elmah在自定义异常中记录字段中的其他信息
或者
是否应将额外的异常详细信息放入"消息"属性中?
解决方案
回答
我不明白这个问题-我们正在扩展System.Exception,并且我们已经添加了Elmah字段。这就是异常所属的地方-作为异常本身的公共属性。
回答
我们不应该在.Message
中填充调试信息,而应该使用简洁,有用的文本。
http://msdn.microsoft.com/zh-CN/library/system.exception.message.aspx
The text of Message should completely describe the error and should, when possible, explain how to correct it. The value of the Message property is included in the information returned by ToString. The Message property is set only when creating an Exception. If no message was supplied to the constructor for the current instance, the system supplies a default message that is formatted using the current system culture. [..] Notes to Inheritors: The Message property is overridden in classes that require control over message content or format. Application code typically accesses this property when it needs to display information about an exception that has been caught. The error message should be localized.
响应数据不符合描述条件。
不熟悉elmah,我无法告诉我们如何在使用Exception
类时进行扩展。 elmah是否实现自己的" Exception"子类?还是界面?你可以自己继承它吗?
回答
我不完全理解这个问题,但是我们似乎在询问如何处理其他异常数据,如果不是问题,请随时忽略此问题。
我认为要问的一个重要问题是异常消息的确切含义是什么?它不是为了知道异常来自何处,而是为了跟踪堆栈。它不是将异常封装在一个更通用的异常中,而应该使用InnerException字段来完成;如果异常仅是从代码中的特定位置引发的,则即使描述该类型的错误也不是为了描述我们所遇到的错误。
通常,我使用消息字段来提供简单的,易读的技巧,而那些不是我的程序员第一次看到此错误可以用来了解底层系统。我认为消息字段适用于简短的解释(一句话),有关如何经常出现此错误的提示或者用于进一步阅读的参考。
因此,据我所知,我认为,存储从另一个系统接收到的"添加信息"的最佳方法是将其作为InnerException。我不认识Elmah,但是如果值得,那么它将检查InnerExceptions并将其存储。
回答
Elmah是一个HTTP模块,记录未处理的异常。
我猜这只是Elmah的局限性,因为它不存储自定义字段。我想我不得不问那些家伙。我在其中有用于响应数据的额外字段,但Elmah不会存储它。
回答
In custom exceptions such as this one, should that extra response data go into the exception "message"?
不,正如塞伦已经指出的那样。但是,异常类型可以覆盖ToString,并在其中明智地添加响应数据信息。这是一种完全正常的做法,在BCL(基类库)中有许多异常类型,因此我们不会发现自己正处在潮流之中。例如,查看SSCLI(转子)中的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属性的内容,该属性表示在程序集加载失败的情况下的其他信息。
How can I get Elmah to record extra information from a field in a custom exception
ELMAH将在异常上调用ToString
的结果存储为错误的详细信息,因此,如果按规定实现了ToString
,则无需进一步工作即可记录该信息。唯一的问题是,记录的详细信息将是非结构化文本。
回答
Exception类包含一个词典(我相信是名为Data),可用于将自定义数据与原始异常相关联。