定义三个异常类:ExceptionA,ExceptionB,ExceptionC
 ?
public class ExceptionA extends Exception {
    public ExceptionA(String str) {
        super();
    }
} 
public class ExceptionB extends ExceptionA { 
    public ExceptionB(String str) {
        super(str);
    }
} 
public class ExceptionC extends ExceptionA {
    public ExceptionC(String str) {
        super(str);
    }
}
异常丢失的情况: 
?
public class NeverCaught {
    static void f() throws ExceptionB{
        throw new ExceptionB("exception b");
    } 
    static void g() throws ExceptionC {
        try {
            f();
        } catch (ExceptionB e) {
            ExceptionC c = new ExceptionC("exception a");
            throw c;
        }
    } 
    public static void main(String[] args) {
            try {
                g();
            } catch (ExceptionC e) {
                e.printStackTrace();
            }
    } 
}
/*
exception.ExceptionC
at exception.NeverCaught.g(NeverCaught.java:12)
at exception.NeverCaught.main(NeverCaught.java:19)
*/
为什么只是打印出来了ExceptionC而没有打印出ExceptionB呢?这个还是自己分析一下吧!
上面的情况相当于少了一种异常,这在我们排错的过程中非常的不利。那我们遇到上面的情况应该怎么办呢?这就是异常链的用武之地:保存异常信息,在抛出另外一个异常的同时不丢失原来的异常。 
?
public class NeverCaught {
    static void f() throws ExceptionB{
        throw new ExceptionB("exception b");
    } 
    static void g() throws ExceptionC {
        try {
            f();
        } catch (ExceptionB e) {
            ExceptionC c = new ExceptionC("exception a");
            //异常连
            c.initCause(e);
            throw c;
        }
    } 
    public static void main(String[] args) {
            try {
                g();
            } catch (ExceptionC e) {
                e.printStackTrace();
            }
    } 
}
/*
exception.ExceptionC
at exception.NeverCaught.g(NeverCaught.java:12)
at exception.NeverCaught.main(NeverCaught.java:21)
Caused by: exception.ExceptionB
at exception.NeverCaught.f(NeverCaught.java:5)
at exception.NeverCaught.g(NeverCaught.java:10)
... 1 more
*/
这个异常链的特性是所有异常均具备的,因为这个initCause()方法是从Throwable继承的。
posted on 2011-12-26 10:25 
墙头草 阅读(1566) 
评论(0)  编辑  收藏