【问题标题】:Is there an easy way to output a human readable object graph (specifically for an exception)是否有一种简单的方法来输出人类可读的对象图(特别是针对异常)
【发布时间】:2010-10-30 23:38:03
【问题描述】:

我有一个未处理的异常处理程序(如果有的话,这是一个矛盾的说法),但我想从中获取更多信息。

目前它会记录异常消息、堆栈跟踪等,并递归地对任何内部异常执行相同的操作。然而,异常通常是异常类的派生类型,因此我不知道它会是什么样子。所以我想要一些代码使用反射将所有原始字段和属性作为名称/值对输出到文本文件,然后递归地对对象图中的任何非原始对象执行相同操作。

我自己尝试过这样做,但很快意识到我必须处理收藏等问题,而且以前一定有人这样做过。我想另一种选择可能是使用序列化。

以前有人做过吗?有代码吗?

【问题讨论】:

  • 您的意思是类似于 PHP for .NET 中的 print_r 命令吗?
  • 可能我对PHP了解不多。
  • 我应该提供一个文档链接 - us2.php.net/print_r - 页面下方有一个输出示例。
  • 在我未经训练的人看来,这看起来像是那种东西,但我在 .net 中需要它。我想知道它如何处理循环引用...

标签: .net reflection serialization exception-handling


【解决方案1】:

我会看看ELMAH 项目。它适用于 ASP.NET,因此您无法直接将其用于 WinForms 项目,但它可能有一些激发灵感的想法。

【讨论】:

    【解决方案2】:

    您可以使用反射来输出异常的所有属性,但是您应该警惕过于复杂的日志记录/异常处理代码,因为异常处理程序中的异常可能会让您没有有用的调试信息来调试您的原始代码例外。 特别是,如果您要递归输出该异常的任何非原始对象,请考虑如果您有任何循环引用会发生什么。

    我通常只在我想记录所有内容时使用 ex.ToString() - 它看起来不太漂亮,并且可能不包含异常中的 所有 数据(除非基类重载了ToString() 方法)但是我发现一般来说它包含足够的信息。

    或者,如果您正在处理您可以控制的自定义异常,那么您可能会发现序列化是一个更好的解决方案。

    【讨论】:

    • 我已经使用反射来获取所有属性和字段,然后已经在它们上调用了 ToString,现在我需要递归地执行此操作。此外,我在未处理的异常处理程序中吞下了异常,这几乎是唯一一次这样做是正确的。我想写这段代码的原因是 ex.ToString 方法没有给我我需要的信息。例如,如果你有一个 SQLException,因为如果死锁 ToString 方法没有给你表名等。显然我可以逐个处理所有预期的异常,但是那些意外的呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2010-12-29
    • 2017-06-21
    • 2017-02-19
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多