(转)深化探究 高效的Java反常处理结构ITeye - AG环亚娱乐

(转)深化探究 高效的Java反常处理结构ITeye

2019年03月04日08时11分40秒 | 作者: 易绿 | 标签: 反常,处理,结构 | 浏览: 851

 三、 反常处理的一般准则

    1、 能处理就早处理,抛出不去还不能处理的就主意消化掉或许转化为RuntimeException处理。由于关于一个运用体系来说,抛出许多反常是有问题的,应该从程序开发视点尽或许的操控反常发作的或许。
    2、 关于查看反常,假如不能卓有成效的处理,还不如转化为RuntimeException抛出。这样也让上层的代码有挑选的地步――可处理也可不处理。
    3、 关于一个运用体系来说,应该有自己的一套反常处理结构,这样当反常发作时,也能得到一致的处理风格,将高雅的反常信息反馈给用户。

    四、 反常的转译与反常链

    1、反常转译的原理

    所谓的反常转译就是将一种反常转化另一种新的反常,或许这种新的反常更能精确表达程序发作反常。

    在Java中有个概念就是反常原因,反常原因导致当时抛出反常的那个反常目标,简直一切带反常原因的反常结构办法都运用Throwable类型做参数,这也就为反常的转译供给了直接的支撑,由于任何方式的反常和过错都是Throwable的子类。比方将SQLException转化为其他一个新的反常DAOException,能够这么写:

    先自界说一个反常DAOException:

    

 public class DAOException extends RuntimeException {
     //(省掉了部分代码)
        public DAOException(String message, Throwable cause) {
            super(message, cause);
        }
    }

    比方有一个SQLException类型的反常目标e,要转化为DAOException,能够这么写:

 

    DAOException daoEx = new DAOException ( "SQL反常", e);

    反常转译是针对一切承继Throwable超类的类而言的,从编程的语法视点讲,其子类之间都能够彼此转化。可是,从合理性和体系规划视点考虑,可将反常分为三类:Error、Exception、RuntimeException,笔者以为,合理的转译联系图应该如图 2:

   

图 2 反常转译

    为什么要这么做呢?笔者以为,反常的处理存在着一套哲学思维:关于一个运用体系来说,体系所发作的任何反常或许过错对操作用户来说都是体系"运转时"反常,都是这个运用体系内部的反常。这也是反常转译和运用体系反常结构规划的辅导准则。在体系中许多处理非查看反常的负面影响许多,最重要的一个方面就是代码可读性下降,程序编写杂乱,反常处理的代码也很苍白无力。因而,很有必要将这些查看反常Exception和过错Error转化为RuntimeException反常,让程序员依据状况来决议是否捕获和处理所发作的反常。

    图中的三条线标识转化的方向,分三种状况:

    ①:Error到Exception:将过错转化为反常,并持续抛出。例如Spring WEB结构中,将org.springframework.web.servlet.DispatcherServlet的doDispatch()办法中,将捕获的过错转译为一个NestedServletException反常。这样做的意图是为了最大极限拯救因过错发作带来的负面影响。由于一个Error常常是很严重的过错,或许会引起体系挂起。

    ②:Exception到RuntimeException:将查看反常转化为RuntimeException能够让程序代码变得更高雅,让开发人员会集司理规划更合理的程序代码,反过来也增加了体系发作反常的或许性。

    ③:Error到RuntimeException:意图仍是相同的。把一切的反常和过错转译为不查看反常,这样能够让代码更为简练,还有利于对过错和反常信息的一致处理。

    1、 反常链

    反常链望文生义就是将反常发作的原因一个传一个串起来,即把底层的反常信息传给上层,这样逐层抛出。Java API文档中给出了一个简略的模型:

   

 try {
     lowLevelOp();
    } catch (LowLevelException le) {
     throw (HighLevelException)
      new HighLevelException().initCause(le);
    }

 

    当程序捕获到了一个底层反常le,在处理部分挑选了持续抛出一个更高等级的新反常给此办法的调用者。这样反常的原因就会逐层传递。这样,坐落高层的反常递归调用getCause()办法,就能够遍历各层的反常原因。这就是Java反常链的原理。反常链的实践运用很少,发作反常时分逐层上抛不是个好留意,上层拿到这些反常又能奈之何?而且反常逐层上抛会耗费许多资源,由于要保存一个完好的反常链信息。

 五、 规划一个高效合理的反常处理结构

    关于一个运用体系来说,发作一切反常在用户看来都是运用体系内部的反常。因而应该规划一套运用体系的反常结构,以处理体系运转进程中的一切反常。

    依据这种观念,能够规划一个运用体系的反常比方叫做AppException。而且对用户来说,这些反常都是运转运用体系运转时发作的,因而AppException应该承继RuntimeException,这样体系中一切的其他反常都转译为AppException,当反常发作的时分,前端接纳到AppExcetpion并做一致的处理。画出反常处理结构如图 3 :

   

图 3 一个运用体系的反常处理结构

    在这个规划图中,AppRuntimeException是体系反常的基类,对外只抛出这个反常,这个反常能够由前端(客户端)接纳处理,当反常发作时,客户端的相关组件捕获并处理这些反常,将"友爱"的信息展现给客户。

    在AppRuntimeException基层,有各式各样的反常和过错,终究都转译为AppRuntimeException,AppRuntimeException下面还能够规划一些其他子类反常,比方AppDAOException、OtherException等,这些都依据实践需要灵活处理。在往下就是如何将捕获的原始反常比方SQLException、HibernateException转化为更高档一点AppDAOException。

    有关反常结构规划这方面公认比较好的就是Spring,Spring中的一切反常都能够用org.springframework.core.NestedRuntimeException来表明,而且该基类承继的是RuntimeException。Spring结构很巨大,因而规划了许多NestedRuntimeException的子类,还有反常转化的东西,这些都是十分优异的规划思维。

    六、 Java反常处理总结

    回忆全文,总结一下Java反常处理的关键:

    1、 反常是程序运转进程进程呈现的过错,在Java顶用类来描绘,用目标来表明详细的反常。Java将其区分为Error与Exception,Error是程序无力处理的过错,Exception是程序能够处理的过错。反常处理是为了程序的健壮性。
    2、 Java反常类来自于Java API界说和用户扩展。经过承继Java API反常类能够完成反常的转译。
    3、 反常能处理就处理,不能处理就抛出,终究没有处理的反常JVM会进行处理。
    4、 反常能够传达,也能够彼此转译,但应该依据需要挑选合理的反常转译的方向。
    5、 关于一个运用体系,规划一套杰出的反常处理体系很重要。这一点在体系规划的时分就应该考虑到。

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章