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