2010-04-04 102 views
5
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); 

有没有更好的方式来记录当前环境?如果我这样做,我需要为我的应用程序中的每种方法写出所有这些东西吗?有没有关于这种情况的最佳做法?

回答

5

作为一般规则,我会努力让记录所有必要的信息,以重现导致错误的事件过程。请注意,您不一定需要在catch块中记录所有内容:您可以在代码中放置(调试)日志语句,这些语句位于名为等的方法中,这些方法使您能够跟踪例外之前发生的事情。另外,您应该将信息放入异常本身,以了解引起异常的确切症状。

恕我直言,通过所有的代码在任何地方添加日志语句可能是矫枉过正 - 或者至少在实际项目中不符合成本效益。相反,专注于最关键的代码部分以最大限度地从您的努力的回报。这些代码部分通常是大多数错误发生和/或大部分修改(即将完成)的地方。因此,在实践中,当你需要触摸一段代码时,考虑日志记录,检查那里已经存在的日志语句(如果有的话),检查异常处理(如果有的话) - 我经常不仅看到像你的例子那样的代码简单地吞下捕获到的异常,但是甚至是空的或自动生成的catch块在我们的遗留代码中...所有这些都可能使应用程序处于未定义状态,这是一件糟糕的事情),并考虑一下是否已经足够了重现失败并了解发生错误时发生了什么。然后尽可能多地改进它,并且可以通过合理的努力。

它还有助于你的队友讨论这个话题,并尝试制定出如何记录事件大体的项目约定,如何处理异常等,这可能会为您节省大量的时间,否则花在追逐的bug和/或改进你的同事所产生的代码:-(

4

这是非常可怕的代码,它吃掉了异常,可能使应用程序处于未定义的状态。一般来说,通过一切手段记录异常将代码中的每一位代码都放在一个try块中),然后重新抛出。

+2

请注意,重掷应该使用'throw;'和* not *'throw ex;'来完成,以避免擦除调用堆栈。 – 2010-04-04 15:06:24

1

您的日志记录框架应该尽可能多地为您捕获上下文。至少它可以很容易地捕获发生错误的类。它还应该记录完整的异常,包括堆栈跟踪和任何内部异常。

As I answered in your other question您应该使用不同的日志级别。一旦你这样做了,如果你正在使用控制容器的反转,那么连接拦截所有方法调用的拦截器是非常简单的任务,并且如果你在调试模式下记录调用,时间戳和任何参数。

0

这是来自Rico Mariani(CLR perf)的example为什么你不应该捕捉所有的例外。诊断真正的问题可能非常困难。

相关问题