六、异常转型和异常链
  异常转型在上面已经提到过了,实际上是捕获到异常后,将异常以新的类型的异常再抛出,这样做一般为了异常的信息更直观!比如:
  public void run() throws MyException{
  ...
  try{
  ...
  }catch(IOException e){
  ...
  throw new MyException();
  }finally{
  ...
  }
  }
  异常链,在JDK1.4以后版本中,Throwable类支持异常链机制。Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。后,它还可以包含 cause(原因):另一个导致此 throwable 抛出的 throwable。它也称为异常链 设施,因为 cause 自身也会有 cause,依此类推,形成了异常链,每个异常都是由另一个异常引起的。
  通俗的说,异常链是把原始的异常包装为新的异常类,并在新的异常类中封装了原始异常类,这样做的目的在于找到异常的根本原因。
  通过Throwable的两个构造方法可以创建自定义的包含异常原因的异常类型:
  Throwable(String message, Throwable cause)
  构造一个带指定详细消息和 cause 的新 throwable。
  Throwable(Throwable cause)
  构造一个带指定 cause 和 (cause==null ? null :cause.toString())(它通常包含类和 cause 的详细消息)的详细消息的新 throwable。
  getCause()
  返回此 throwable 的 cause;如果 cause 不存在或未知,则返回 null。
  initCause(Throwable cause)
  将此 throwable 的 cause 初始化为指定值。
  在Throwable的子类Exception中,也有类似的指定异常原因的构造方法:
  Exception(String message, Throwable cause)
  构造带指定详细消息和原因的新异常。
  Exception(Throwable cause)
  根据指定的原因和 (cause==null ? null : cause.toString()) 的详细消息构造新异常(它通常包含 cause 的类和详细消息)。
  因此,可以通过扩展Exception类来构造带有异常原因的新的异常类。
  七、Java异常处理的原则和技巧
  1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
  2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
  3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
  4、不要把自己能处理的异常抛给别人。
  5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。