interceptor不能传递exception,只能传递runtime类型的,是出于什么考虑呢。

发布于 2021-11-29 00:20:56 字数 816 浏览 838 评论 3

@JFinal 你好,想跟你请教个问题:interceptor不能传递Exception,只能传递RuntimeException类型的,是出于什么考虑呢。我try catch 了异常,还必须重新抛出个RuntimeException,才能给下一个interceptor。

/**
	 * 实现mybatis下的事务控制
	 * @param ai
	 */
	private void interceptForMyBatis(Invocation ai){
		MyBatisSessionManager.setSession(true); 
		log.warn("RapidTx:已获取数据库连接...");
		try {
			log.warn("RapidTx:准备执行业务...");
			ai.invoke();
			log.warn("RapidTx:业务已执行...");
		}catch (BizException e){
			throw e;
		}catch (Exception e) {
			e.printStackTrace();
			throw new RapidException(e.getMessage());
		}finally{
			MyBatisSessionManager.closeSession();
			log.warn("RapidTx:数据库 连接已释放...");
		}
	}



如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风苍溪 2021-11-30 11:56:44

好的,谢谢,貌似明白了。那您看我目前这种处理方式可以吗?

葬花如无物 2021-11-30 05:07:25

回复
你在 finally 块中关闭了资源,这就是 jfinal Interceptor 的 intercept 为啥不定义成 throws Exception 的目的

等风来 2021-11-29 05:09:21

   java 语法要求 Exception 需要被 catch 住,然后进行一定的处理,只有 RuntimeException 可以是例外,所以,假如 jfinal 的 intercept(...)  方法声明使用了 throws Exception ,那么在语法上来说 intercept 方法中就不需要 catch 任何参数了,这样最直接的后果就是造成资源无法被回收。

    举个最简单的例子,你在 intercept 中使用 DataSource.getConnection() 获取了一个数据库连接,然后在数据库操作时产生了异常,由于 intercept 方法声明了 throws Exception,所以在语法上你不需要写 try catch ,所以很容易忘了在异常出现的情况之下去关闭数据库连接,这样就造成了资源泄漏,数据库连接会因为这处代码逐步被耗尽。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文