异常处理规范

异常是报告错误的标准机制,当违反语义约束时,Java将抛出一个异常,并且将程序执行的控制流从异常发生的点转移到用户指定的点。异常也可以被显式地使用throw关键字来抛出。

异常的定义

Java的异常类层次结构以Throwable开始,扩展出Error和Exception,而Exception又扩展出RuntimeException。除了Java提供了大量异常子类,例如iuap 平台的部分组件中提供了如 BusinessException,WebRuntimeException等异常类型。如需更加具体,可以定义自己的异常类。

在定义和使用异常的时候要遵循以下几个原则:

  1. 不要将异常用于控制流,仅为异常情况使用异常;
  2. 对可恢复异常情况使用检查型异常;对编程错误如前置条件错误等情况使用运行时异常;
  3. 避免使用不必要的检查型异常,不要对调用者根本就不可能恢复的情况或者说可以预见到必然会使程序退出的情况使用检查型异常;
  4. 抛出异常应与抽象层次相适应,方法抛出的异常必须和该方法所实现的功能在抽象层次上一致。
  5. 异常需要输出丰富的应用信息(如堆栈信息)来反映出错的原因和位置用来定位问题。

异常的捕获

Java可以对同一try块定义多个catch块,从而对每种异常分别进行恰当的处理。

  1. 捕获异常时尽量明确异常的类型,对于当前程序没有能力处理这个异常的时候不要处理,应该在方法的throws子句声明异常,把异常处理的责任往调用链的上游传递;
  2. 过早捕获异常,通常会导致更严重的错误和其他异常;
  3. 不要不分类型就立即将代码用try块包装起来并使用catch捕获异常;
  4. 对于泛化异常,应该捕获具体的异常并且传递给用户可以看懂的信息。 例如iuap 框架的iweb组件中提供了 com.yonyou.iuap.iweb.exception.WebRuntimeException 的运行时异常,可以通过WebRuntimeException.setHint(String hint) 方法设置要传递给用户的信息。