异常处理:和日志集成

1/5/2008来源:Java教程人气:5803

  在软件实现中,异常和日志都是重要的质量保证手段,经常,我们总是需要在系统实现上同时提供异常和日志,并且总是在“距离”很近的地方实现的,下面是一段典型的使用异常和日志的代码:
   来源:http://www.matrix.org.cn/blog/X-Brave/

  try{
         //do something here...
     }catch(Exception e){
         log.error(“Your business exception message…”);
         throw new BusinessException(“Your business exception message…”);
    }
    
  类似的代码我们经常碰到。虽然类似的代码都是简单的,但在现实中我们可以发现,一些时候粗心的程序员总是忽略或者忘记了两者都需要书写并且尽可能使用一致的异常消息。既然异常和日志总是同时出现的,那么我们就可以把两者集合起来。实际上在我看来,他们本来就是一家人。
    
  为了达到异常和日志的集合,我测试过2种做法:一种选择是在自定义异常类中提供支持;一种是异常消息拼凑时提供支持。我们也可以在其中提供额外的功能来保证系统的效能,包括“适度”缓冲的异常处理。但需要非凡注重的是,这种处理所带来的“长过程”(也就是经过不止一个步骤才完成这些功能)开销,在缓冲异常信息可能带来的系统出错时异常丢失,以及在异常消息处理时可能出现错误需要提供额外的保护措施。
    
  更进一步的,我们应该注重到如下事实:
    
  首先,异常的层次结构是不同的。它包括了底层的LowlevelException(合称相关需要抛出异常的异常处理)和上层的异常使用者,细心的读者应该发现,上述的实例实际上属于LowlevelException。
    
  其次,我们也应该注重到异常包括客户定制的异常如BusinessException和java自带的异常。这些异常的共存如何进行统一是我们需要面对的,但通常,我认为异常的客户定制包装是必要的,非凡是多层结构下这个客户定制化就是让异常具有轻易理解的信息。
    
  异常和日志的集合,是一种简单、实用的创新做法,在这种实现里面,你可以提高系统异常处理的一致性程度、你可以提供经过缓冲的日志输出的一致性做法,我们也注重到她的处理的灵活性,必要时,你可以关闭她。
    

  当然,无论如何,异常和日志的集合也好,分离也好,任何时候,人的因素才是最重要的,更一般的,我们可以发现,异常和日志要做的就是把系统非凡的或者重要的情况记录下来,这些记录信息应该具有明确的信息保证她是可读的、可定位的,实际上,这就是异常处理的全部。简单的说,“异常处理:实用就是好”(参考http://www.matrix.org.cn/blog/X-Brave/《异常处理:实用就是好》)。

    实际上,为了提高性能和保证系统的正确性,我很想使用异步消息机制来完成这些功能,或者至少我需要保证系统在 集群 环境下的正确性,但我拒绝使用复杂的第三方技术来实现这些要求(性能和依靠考虑),也不优先考虑使用高端服务器所自带的或者外购的消息服务组件,我也缺乏对 集群 环境的实际经验,这些现实妨碍了我对更好的实现的尝试。

    但通过在系统中提供开关功能、对缓冲数据进行数目控制以及只在有限的几个或者一个地方提供具体实现,所以,对屏蔽该功能是轻易的。当然,对至少两种实现的较高强度测试都是没有问题的。究竟,真正的分布式的实现,非凡是 集群 环境下的处理,并非如很多人宣称的那么轻易实现。这种既满足了当前绝大部分需求(包括性能和可靠性)也充分考虑可能的影响并提供小开销解决方案的处理,我想,是足够了的。