您是如何在已经使用的C#项目中使用Exception.Data属性的?
我想要一些表示模式的答案,而不是那些非常适合您应用的模式。
答案 0 :(得分:18)
我使用的异常记录器已被调整以写出Data集合中的所有项目。然后,对于我们遇到的每个异常,我们无法从异常堆栈中进行诊断,我们添加该函数范围内的所有数据,发出新的构建,并等待它重新发生。
我想我们是乐观主义者,因为我们没有把它放在每个功能中,但我们是悲观主义者,因为我们在解决问题后不会把它拿出来。
答案 1 :(得分:16)
当我知道我正在创建的异常需要序列化时,我已经使用过它了。有一天使用Reflector,我发现Excepion.Data卡在序列化流中并从中拉出。
因此,基本上,如果我在自定义异常类上具有可序列化类型的属性,我在派生类上实现它们并使用底层数据对象作为其存储机制,而不是创建私有字段来保存数据。如果我的自定义异常对象的属性需要更高级的序列化,我通常使用支持私有字段来实现它们,并在派生类中处理它们的序列化。
最重要的是,Exception.Data只是通过将属性粘贴到其中来免费为您提供序列化 - 但请记住这些项目需要序列化!
答案 2 :(得分:11)
由于没有答案包含任何代码。作为这个问题的补充可能有用的东西是如何实际查看123456789|acme business <lots of spaces>|1234 main st <lots of spaces>|etc...
字典。由于它不是通用字典,只返回.Data
IDictionary
kvp的类型实际上是foreach(var kvp in exception.Data)
无益的。但是从MSDN可以轻松地迭代这个词典:
object
我真的不知道格式参数foreach (DictionaryEntry de in e.Data)
Console.WriteLine(" Key: {0,-20} Value: {1}",
"'" + de.Key.ToString() + "'", de.Value);
意味着什么,也许Take(20)? Digressing ...这段代码在常见的错误记录器中非常有用,可以解开这些数据。更完整的用法类似于:
, -20
答案 3 :(得分:10)
当Exception从堆栈中向上移动时,我用它来从封闭范围捕获异常时的状态信息。诸如导致异常的文件名之类的项目,或者有助于追踪问题的某些ID的值。
在Web应用程序的最顶层,我也倾向于添加大量的Request信息,如RawUrl,cookies,Referrer,......
有关详细信息,请参见my blog on the topic:
我不会等待问题发生,而是将此代码添加到可能发生与外部事物相关的异常的任何地方,例如:文件名或正在访问的URL,...换句话说,任何有助于重现问题的数据。