public void EatDinner(string appetizer, string mainCourse, string dessert)
{
try
{
// Code
}
catch (Exception ex)
{
Logger.Log("Error in EatDinner", ex);
return;
}
}
当特定方法发生异常时,我应该记录什么?
我在使用的代码中看到了很多以上内容。在这些情况下,我总是要与遇到错误的人交谈,找出他们在做什么,逐步完成代码,并尝试重现错误。
是否有最佳做法或方法可以最大限度地减少所有额外工作?我应该像这样在每个方法中记录参数吗?
Logger.Log("Params: " + appetizer + "," + mainCourse + "," + dessert, ex);
是否有更好的方法来记录当前环境?如果我这样做,我是否需要为我的应用程序中的每个方法写出所有这些内容?是否有关于此类场景的最佳实践?
答案 0 :(得分:5)
作为一般规则,我会说努力记录重现导致错误的事件过程所需的所有信息。请注意,您不一定需要记录catch
块内的所有内容:您可以在代码中调用(调试)日志语句,在调用等方法中使用,这样您就可以直接跟踪之前发生的事情。例外。此外,您应该将信息放入异常本身,以确定导致它的确切症状。
恕我直言通过所有代码在任何地方添加日志声明可能过度 - 或者至少在现实生活中没有成本效益。相反,专注于最关键的代码部分,以最大限度地提高您的工作回报。这些代码部分通常是发生大多数错误和/或(将要)完成大部分修改的地方。所以在实践中,每当你需要触摸一段代码时,考虑记录,检查那里已经存在的日志语句(如果有的话),检查异常处理(如果有的话) - 我通常不仅看到像你的例子那样的代码只是吞下被捕获的异常,但是我们的遗留代码中甚至是空的或自动生成的catch
块......所有这些都可能使应用程序处于未定义状态,这是一个不好的事情),并考虑是否已存在足以让您重现故障并了解发生错误时发生的情况。然后尽可能多地改进它,并且可以合理的努力。
它还有助于与您的团队成员讨论此主题,并尝试制定一个粗略的项目约定,了解如何记录事件,如何处理异常等。这可能会为您节省大量时间。花在追逐错误和/或改进你的同事生成的代码上: - (
答案 1 :(得分:4)
这是非常可怕的代码。它吃掉了异常,可能会使应用程序处于未定义状态。通常,一定要记录异常(但不要在try块中包装每一位代码),但是然后重新抛出它。
答案 2 :(得分:1)
您的日志记录框架应尽可能多地捕获上下文。至少它可以很容易地捕获发生错误的类。它还应该记录完整的异常,包括stacktrace和任何内部异常。
As I answered in your other question您应该使用不同的日志级别。一旦你这样做,如果你正在使用控制容器的反转,那么连接拦截所有方法调用的拦截器是一个相当简单的任务,如果你处于调试模式,则记录调用,时间戳和任何参数。 / p>
答案 3 :(得分:0)
这是来自Rico Mariani(CLR perf)的example,为什么你不应该抓住所有例外。诊断真正的问题真的很难。