摘自Java核心技术卷I 第10版 274页 7.2.3再次抛出异常与异常链
在catch子句中可以抛出一个异常,这样做的目的是改变异常的类型。如果开发了一个供其他程序员使用的子系统,那么,用于表示子系统故障的异常类型可能会产生多种解释。ServletException就是这样一个异常类型的例子。执行servlet的代码可能不想知道发生错误的细节原因,但希望明确地知道servlet是否有问题。
下面给出了捕获异常并将它再次抛出的基本方法:
try {
access the database
} catch (SQLException e) {
// ServleException 用带有异常信息文本的构造器来构造。
throw new ServletException("database error: " + e.getMessage());
}
不过,可以有一种更好的处理方法,并且将原始异常设置为新异常的“原因”:
public class StudyException {
/**
* 再次抛出异常与异常链
*/
public void accessDatabase() throws ServletException {
try {
access the database...
} catch (SQLException e) {
// 第一种方式
ServletException se = new ServletException("database error");
se.initCause(e);
throw se;
// 第二种方式
throw new ServletException("database error", e);
}
}
public static void main(String[] args) {
try {
accessDatabase();
} catch (ServletException e) {
// 当在外层捕获到异常时,就可以使用下面这条语句重新得到原始异常
Throwable e = se.getCause();
// 打印该异常的堆栈跟踪时会同时打印包含在该异常中的异常(在本案例中是SQLException异常)堆栈信息
e.printStackTrace();
}
}
}
强烈建议使用这种包装技术。这样可以让用户抛出子系统中的高级异常,而不会丢失原始异常的细节。