浅淡JAVA异常机制如何设计

来源:互联网 发布:js vr 插件 编辑:程序博客网 时间:2024/06/05 09:46

一、异常的好处

     异常带来诸多好处。首先,它将错误处理代码从正常代码(normal code)中分离出来。你可以将那些执行概率为99.9%的代码封装在一个try块内,然后将异常处理代码置于catch子句中。这种方式的好处是,正常代码因此而更简洁。

     如果你不知道如何处理某个方法中的一个特定错误,那么你可以在方法中抛出异常,将处理权交给其他人。如果你抛出一个检查异常(checked exception),那么Java编译器将强制客户程序员(cilent programmer)处理这个潜在异常,或者捕捉之,或者在方法的throws子句中声明之。Java编译器确保检查异常被处理,这使得Java程序更为健壮。

 

二、什么时候抛出异常

     如果方法遇到一个不知道如何处理的意外情况(abnormal condition),那么它应该抛出异常。那么什么是意外情况呢?意外情况就是指方法的“正常功能”(normal functioning)之外的情况。

 

三、异常处理设计的准则

      1、选择checked还是Unchecked的几个经典依据。

      2、Exception的封装问题。

      3、如果没有必要不要创建自己的Exception。

      4、不要用Exception来作流程控制。

      5、不要轻易忽略捕获的Exception。

      6、不要简单的捕获最顶层的Exception.

 

四、举例说明(一)

 

Java代码  收藏代码
  1. public void exceptionTest1(){  
  2.      try {  
  3.          ...some code that throws exceptions  
  4.      } catch (Exception ex){  
  5.           ex.printStacktrace();  
  6.      }  
  7. }  

        那么大家可以看看,上面的代码有没有问题?

在回答以前让我们想想怎样才是正确的?是的,一旦程序碰到异常,它就该挂起程序而"做"点什么。那么上边的代码是这样子的么?看吧,它隐瞒了什么?它把所有的"苦水"往肚里咽(在控制台打印出异常信息),然后一切继续,从表面上看就像什么都没有发生过一样......,很显然,上边代码达到的效果并不是我们所期望的。所以不应该在catch语句中只在控制台打印异常信息

 

    那如果是以下这行代码呢?

Java代码  收藏代码
  1. public void someMethod() throws Exception {}  

    很显然这个方法体是空的。一个方法体是空的这个能抛出什么异常呢?当然JAVA语法中并没有规定这样写。


五、异常原理

     大体上来说有“三种情况”会导致异常的抛出。

     1、编程错误导致异常。

     2、客户端调用引起的异常。

     3、访问资源失败导致异常。

六、设计异常的最佳实践

     1、当要决定是采用checked exception还是Unchecked exception的时候,你要问自己一个问题,"如果这种异常一旦抛出,客户端会做怎样的补救?"
      如果客户端可以通过其他的方法恢复异常,那么这种异常就是checked exception;如果客户端对出现的这种异常无能为力,那么这种异常就是Unchecked exception;从使用上讲,当异常出现的时候要做一些试图恢复它的动作而不要仅仅的打印它的信息。

     尽量使用unchecked exception来处理编程错误:因为unchecked exception不用使客户端代码显示的处理它们,它们自己会在出现的地方挂起程序并打印出异常信息。Java API中提供了丰富的unchecked excetpion,譬如:NullPointerException , IllegalArgumentException 和 IllegalStateException等,因此我一般使用这些标准的异常类而不愿亲自创建新的异常类,这样使我的代码易于理解并避免的过多的消耗内存。

 

 2、保护封装性

     不要让你要抛出的checked exception升级到较高的层次。

     例如,不要让SQLException延伸到业务层。业务层并不需要(不关心?)SQLException。你有两种方法来解决这种问题。

     转变SQLException为另外一个checked exception,如果客户端并不需要恢复这种异常的话;

     转变SQLException为一个unchecked exception,如果客户端对这种异常无能为力的话;

     代码如下所示:

 

Java代码  收藏代码
  1. public void exceptionTest2(){  
  2.     try{  
  3.        ..some code that throws SQLException  
  4.     }catch(SQLException ex){  
  5.        throw new RuntimeException(ex);  
  6.     }  
  7. }  

 

以上是我在平时工作的经验总结,虽然看似简单但有时候在工作中,却难免有疏忽之举。