Java 提供了两类主要的异常 :runtime exception 和 checked exception 。所有的 checked exception 是从 java.lang.Exception 类衍生出来的,而 runtime exception 则是从 Java.lang.RuntimeException 或 java.lang.Error 类衍生出来的。
从逻辑的角度来说, checked exceptions 和 runtime exception 是有不同的使用目的的。 checked exception 用来指示一种调用方能够直接处理的异常情况。而 runtime exception 则用来指示一种调用方本身无法处理或恢复的程序错误。
框架定义了一个异常基类 ApplicationException 是属于 checked exceptions 类型主要有以下几个功能:
1、 异常自底向上抛出统一处理,减少处理代码:
传统(过程式)方式编程,采用返回参数告诉调用的函数被调用的函数出现错误,所以在调用函数里面要加入很多的 if 从句来判断各个被调用函数是否正确返回值,代码充斥了大量的大括号。采用异常机制,发生异常的位置包装成自定义的应用异常然后向上抛出,上面的各层均不用处理直接抛出到统一异常处理的 MainController 里面即可,由统一的类来处理
2、 异常统一编号,用户看到统一的处理信息:
每个异常都可以确定编号,并将编号与提示信息维护在数据库中,页面只显示统一维护的错误信息,这样就不会让错误信息编程开发人员随手写的不规范而且难以理解的信息,造成用户感觉系统难以使用。
3、 异常信息记录到错误日志中方便追踪异常位置:
统一处理程序抓取异常,并将异常信息记录日志。调试阶段还可以在控制台信息中打出异常堆,方便开发人员快速定位异常发生位置。
4、 根据获取异常 AOP 声明式事务控制进行回滚操作:
整个开发使用声明式的事务,何时回滚就取决与应用异常的抛出。
配置如下:
<property name="transactionAttributes"> <props> <prop key="insert*"> PROPAGATION_REQUIRED,-ApplicationException </prop> </props> </property> |
应用异常基类如下图:
file:///C:/Documents%20and%20Settings/Administrator/%E6%A1%8C%E9%9D%A2/ssh%E4%B8%AD%E5%BC%82%E5%B8%B8%E7%9A%84%E5%A4%84%E7%90%86/%E5%9F%BA%E4%BA%8EJ2EE%E8%BD%BB%E9%87%8F%E7%BA%A7%E5%AE%B9%E5%99%A8%E6%9E%84%E4%BB%B6%E6%A1%86%E6%9E%B6%E5%9B%9B%E3%80%81%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86_files/a.bmp
其它异常都继承于基类 ApplicationException ,主要包含错误编号属性( errorNumber )、异常信息( errorMessage )、异常跟踪 (stackTrace) 。以便实现上述功能。