实例7 - 异常处理

2019-01-04  本文已影响0人  静筱

引言

java中提供了丰富的异常处理方式。
每个人的代码中都少不了try catch, 但是如何使用异常处理,才会最大化程序的健壮性和可维护性呢?

用好异常机制的前提是充分理解以下两个问题:

  1. 理解exception和error的差别
  2. 理解运行时异常和其他异常的差别

详见文档:Java异常汇总

原则:

try{
    array[i++].toString();
    String b = new String(c); 
}catch(Throwable e){

}

主要问题

  1. 可读性差,对比:
try{
    array[i++];
    }catch(ArrayIndexOutOfBoundException e){
    logger.error..
    }
   
  1. 一些我们希望能抛出来的RuntimeException会被吞掉。
  2. OutOfMemoryError等异常也不能被正常处理

主要问题

  1. try-catch在执行时有额外的jvm开销,所以try-catch不能滥用,否则程序整体性能会受影响。
try{
    function();
    }catch(ArrayIndexOutOfBoundException e){
    //1. do nothing
    //2. e.printStackTrace()
    }

主要问题

  1. 没有抛出异常,也没有记录异常。生产环境中遇到这种情况完全没法诊断。
  2. e.printStackTrace()会输出到标准输出流里。在分布式等复杂架构的线上系统中,无法准确定位标准输出流文件。正常的方式,应该是输出到统一的产品日志中。
try{
    
    while(true){
        array[i++].climb();
    }
}catch(ArrayIndexOutOfBoundException e){
}

主要问题

  1. 可读性不好,对比:
for(Mountain m:array){
    m.climb();
}
  1. 异常被吞: catch到ArrayIndexOutOfBoundException之后没有输出到产品日志中,不便于线上问题诊断。

  2. array不一定会被完全遍历: climb()方法里若抛出ArrayIndexOutOfBoundException。

  3. 现代JVM中对正常的数组遍历是有优化的,不使用正常的遍历比如for,foreach等,而是使用try catch的方式来实现遍历,无法享受jvm的优化。

SomeClass result = new SomeClass();
try{
        return result;
}catch(CertainException e){
       //logger.error...
}finally{
    result.setSomeMember(323);
}

这种情况下返回的对象的SomeMember属性会变化

上一篇下一篇

猜你喜欢

热点阅读