Exception 发生异常时要记录什么?

Exception 发生异常时要记录什么?,exception,logging,exception-handling,Exception,Logging,Exception Handling,当特定方法中发生异常时,我应该记录什么 在我使用的代码中,我看到了很多上述内容。在这些情况下,我总是必须与经历错误的人交谈,以了解他们在做什么,逐步完成代码,并尝试重现错误 有什么最佳实践或方法可以让我最大限度地减少这些额外的工作吗?我应该像这样记录每个方法中的参数吗 public void EatDinner(string appetizer, string mainCourse, string dessert) { try { // Code } catc

当特定方法中发生异常时,我应该记录什么

在我使用的代码中,我看到了很多上述内容。在这些情况下,我总是必须与经历错误的人交谈,以了解他们在做什么,逐步完成代码,并尝试重现错误

有什么最佳实践或方法可以让我最大限度地减少这些额外的工作吗?我应该像这样记录每个方法中的参数吗

public void EatDinner(string appetizer, string mainCourse, string dessert)
{
   try
   {
      // Code
   }
   catch (Exception ex)
   {
      Logger.Log("Error in EatDinner", ex);
      return;
   }
}

是否有更好的方法记录当前环境?如果我这样做的话,我是否需要写出应用程序中每个方法的所有内容?关于这种情况,有什么最佳实践吗?

作为一般规则,我想说的是努力记录所有必要的信息,以重现导致错误的事件过程。请注意,您不一定需要在
catch
块中记录所有内容:您可以在代码、调用的方法等中放置(调试)日志语句,这样您就可以直接跟踪异常之前发生的情况。此外,您应该将导致异常的确切症状的信息放入异常本身

public void EatDinner(string appetizer, string mainCourse, string dessert)
{
   try
   {
      // Code
   }
   catch (Exception ex)
   {
      Logger.Log("Error in EatDinner", ex);
      return;
   }
}
在所有代码中添加日志语句的IMHO可能有点过火——或者至少在现实项目中没有成本效益。相反,专注于最关键的代码部分,以最大化您的努力回报。这些代码部分通常是发生错误最多和/或(将)进行修改最多的地方。因此,在实践中,每当您需要接触一段代码时,考虑日志记录,检查已经存在的日志语句(如果有),检查异常处理(如果有的话-我经常看到的不仅仅是像您的示例那样简单地吞下捕获的异常的代码,甚至还有遗留代码中的空或自动生成的
catch
块……所有这些都可能使应用程序处于未定义状态,这是一件坏事),并思考现有的内容是否足以让您重现失败,并了解发生错误时会发生什么。然后,尽可能地通过合理的努力改进它


与您的团队成员讨论此主题也有助于制定一个大致的项目惯例,其中包括如何记录事件、如何处理异常等。这可能会为您节省大量时间,否则您会花在追踪错误和/或改进同事编写的代码上:-(

这是非常可怕的代码。它会吃掉异常,可能会使应用程序处于未定义的状态。一般来说,一定要记录异常(但不要将所有代码都包装在try块中),然后重新抛出它。

您的日志框架应该为您捕获尽可能多的上下文。至少它可以轻松捕获发生错误的类。它还应该记录完整的异常,包括stacktrace和任何内部异常


您应该使用不同的日志级别。完成此操作后,如果您使用的是控制反转容器,那么连接一个拦截器将拦截所有方法调用是一项相当简单的任务,如果您处于调试模式,则记录调用、时间戳和任何参数。

这里是Rico Mariani(CLR perf)提供的一个示例为什么不应该捕获所有异常。诊断真正的问题可能非常困难。

请注意,重新抛出应该使用
throw;
而不是
throw ex;
,以避免擦除调用堆栈。