发生异常时要记录什么?

时间:2010-04-04 14:29:36

标签: exception logging exception-handling

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);

是否有更好的方法来记录当前环境?如果我这样做,我是否需要为我的应用程序中的每个方法写出所有这些内容?是否有关于此类场景的最佳实践?

4 个答案:

答案 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,为什么你不应该抓住所有例外。诊断真正的问题真的很难。