try
{
// Code
}
catch (Exception ex)
{
Logger.Log("Message", ex);
throw;
}
对于库,我是否应该记录异常?我应该抛出它并允许应用程序记录它吗?我担心的是,如果我在库中记录异常,将会有很多重复(因为库层将记录它,应用程序层将记录它,以及介于两者之间的任何东西),但如果我不记录它库,很难找到错误。对此有最佳实践吗?
答案 0 :(得分:3)
我不会记录一个我不会做任何事情的异常 - 也就是说,如果它只是通过例子中的异常处理程序。正如您已经提到的,这会增加很多不一定有用的噪音。最好将它记录在您实际处理它的位置,或者,如果是库,则在它转换为用户代码的边界处。
那就是说,我总是尝试记录我抛出异常的点以及触发异常的条件。这对于确定异常的原因更为有用;另外,如果您遇到的情况严重到足以保证抛出异常,我会说它还保证花费处理器时间来记录'为什么'。
答案 1 :(得分:2)
我倾向于选择将日志记录保留到最高级别的客户端,或者允许客户端通过向库提供TextWriter来启用/禁用日志记录,以便库在其运行时将其错误/输出记录到库中一个没有权限写入其通常日志的环境。
我更喜欢在更高级别登录的原因是较高级别具有更多上下文信息,并且可能知道更合适的方式来报告/记录这些错误。由于异常现在仍然存在所有堆栈跟踪信息,因此我不认为通过在异常发生时立即记录来获得更多收益。但是,您必须要小心转换为其他类型的异常的异常,因此如果要在处理异常时一直使用InnerException,以便保留有关错误源的所有信息。 / p>
编辑:当然,这种理念只适用于遵循我的其他哲学的环境:永远不要忽视异常。如果客户端或某个中间层抛出异常,那么您还有其他问题,并且可能需要至少将异常日志默认为生成的某些输出,即使客户端是不负责任的。
答案 2 :(得分:1)
您应该记录它并将其抛出,以便应用程序可以将其记录下来。特别是如果它是一个库,你应该记录它,因为你不应该假设应用程序肯定会记录它!(它可能会也可能不会)。
答案 3 :(得分:1)
日志异常也可以是调试应用程序的方法。
答案 4 :(得分:1)
使用log4net。认真。
通过使用这样一个标准且普遍存在的图书馆,您可以从花费很长时间思考这个问题的人那里获得指导。解决方案是大多数日志记录库都有多个级别的日志记录。
在log4net中我可以做
ILog log = LogManager.GetLogger("some logger");
log.Debug("some debugging info");
log.Info("some message meaningful in the domain");
log.Warn("something might be occurring that merits your attention");
log.Error("Everything just went to hell")
然后,应用程序管理员可以设置他有兴趣看到的不同级别的日志记录。甚至可以允许他在运行时更改此配置。事实上,使用像log4net这样强大的日志记录库,您可以将不同来源的不同日志记录级别指向不同的appender。例如,您可以拥有一个滚动文件,其中包含存储在硬盘上的上周所有日志消息,所有信息,警告和错误消息都不会在您的数据访问层中发送到数据库中,并且所有错误都已发送通过电子邮件发送给你。
我认为你所描述的内容在“调试”日志级别下非常明显。
您当然可以自己实现日志记录级别,但如果使用您的库的任何人都有兴趣查看所有调试信息,那么除了他们正在使用的系统之外,他们还必须学习您的系统。更好地实现标准化。
所以最佳实践: