再次抛出异常与异常链

摘自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();
		}
   }
}

强烈建议使用这种包装技术。这样可以让用户抛出子系统中的高级异常,而不会丢失原始异常的细节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值