当前位置:  开发笔记 > 编程语言 > 正文

使用Exception.Data

如何解决《使用Exception.Data》经验,为你挑选了4个好方法。

你是如何使用你曾经使用的C#项目中的Exception.Data属性的?

我想要一些建议模式的答案,而不是那些非常适合您的应用的模式.



1> Austin Salon..:

我使用的异常记录器已被调整以写出数据集合中的所有项目.然后,对于我们遇到的每个异常,我们无法从异常堆栈中进行诊断,我们添加该函数范围内的所有数据,发出新的构建,并等待它重新发生.

我想我们是乐观主义者,因为我们没有把它放在每个功能中,但我们是悲观主义者,因为我们一旦解决问题就不会把它拿出来.



2> Peter Meyer..:

当我知道我正在创建的异常需要序列化时,我已经使用过它了.有一天使用Reflector,我发现Excepion.Data卡在序列化流中并从中拉出.

因此,基本上,如果我在自定义异常类上具有可序列化类型的属性,我在派生类上实现它们并使用底层数据对象作为它们的存储机制,而不是创建私有字段来保存数据.如果我的自定义异常对象的属性需要更高级的序列化,我通常使用支持私有字段来实现它们,并在派生类中处理它们的序列化.

最重要的是,Exception.Data只是通过将属性粘贴到其中来免费为您提供序列化 - 但请记住这些项目需要可序列化!


这种方法的唯一问题是Data属性被定义为virtual,这意味着你不应该在Exception的构造函数中使用它(由FxCop报告).如果您希望将构造函数设置为链接到数据字典的自定义属性,那么这是一个问题.
或者只是不关心,从构造函数调用虚方法只会让您在不寻常的边缘情况下遇到麻烦

3> Ian Mercer..:

当异常向上移动时,我用它来从封闭范围捕获异常时的状态信息.诸如导致异常的文件名之类的项目,或者有助于追踪问题的某些ID的值.

在Web应用程序的最顶层,我也倾向于添加大量的Request信息,如RawUrl,cookies,Referrer,......

有关详细信息,请访问我的博客:

我没有等待问题发生,而是将此代码添加到可能发生与外部事物相关的任何地方,例如文件名或正在访问的URL,...换句话说,任何有助于重现的数据问题.



4> Chris Marisi..:

由于没有答案包含任何代码.作为这个问题的补充可能有用的东西是如何实际查看.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();

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有