例外:我如何获得最可能的信息?

gre*_*b64 4 .net c# reflection logging exception

我有一个企业应用程序,可以在发生任何事件时记录异常信息.该应用程序是C#和C++ .net的组合.

我想在异常时获得尽可能多的信息.截至目前,我们只打印出Message和堆栈跟踪(在调试版本中提供行号,但不释放).

任何错误日志的目标都是尽可能地指出错误(尽可能接近).我很好奇我怎么能走得更远?我想要更多信息.

作为一个例子,我知道NullReferenceExceptions和InvalidArguementExceptions包含不同数量的信息,但我没有利用除"消息"字段之外的任何东西.

我最好的选择是使用反射并捕获所有公共成员并打印出来吗?或者可能链式TONS进行类型检查和转换,以便干净地打印出来?作为约束,我的日志记录功能只需要接受Exception类型的参数.

Joh*_*ers 9

一般来说,答案是记录ex.ToString().通常,对象的ToString方法显示对象希望您知道的内容.对于基本Exception类,除了包含任何InnerException实例的消息和堆栈跟踪之外,还包括消息和堆栈跟踪.特定派生类的Exception可能会显示更多信息.

SqlException等一些异常也会捕获其他信息(如存储过程名称和亚麻布).在这些情况下,序列化整个异常并将其作为XML保存在日志记录数据库中会很有帮助.请注意,并非所有异常类都可以序列化,因此请准备好在XML部分上进行操作.

此外,如果你所做的只是记录异常,那么你可能想要重新抛出异常,以便更高级别有机会处理它.当然,当你已经处于"顶级"时,这不适用.


Sys*_*gon 5

试试看:

try 
{
    //...
}
catch(Exception ex)
{
    Messagebox.Show(ex.ToString());
}
Run Code Online (Sandbox Code Playgroud)

它显示了很多信息,包括所有异常的异常类型消息堆栈跟踪InnerException所有异常排序)。

MSDN中的更多信息。

  • 为什么要投票?ex.ToString()是获取异常希望您了解的所有信息的正确方法吗? (3认同)