interceptor不能传递exception,只能传递runtime类型的,是出于什么考虑呢。
@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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
好的,谢谢,貌似明白了。那您看我目前这种处理方式可以吗?
回复
你在 finally 块中关闭了资源,这就是 jfinal Interceptor 的 intercept 为啥不定义成 throws Exception 的目的
java 语法要求 Exception 需要被 catch 住,然后进行一定的处理,只有 RuntimeException 可以是例外,所以,假如 jfinal 的 intercept(...) 方法声明使用了 throws Exception ,那么在语法上来说 intercept 方法中就不需要 catch 任何参数了,这样最直接的后果就是造成资源无法被回收。
举个最简单的例子,你在 intercept 中使用 DataSource.getConnection() 获取了一个数据库连接,然后在数据库操作时产生了异常,由于 intercept 方法声明了 throws Exception,所以在语法上你不需要写 try catch ,所以很容易忘了在异常出现的情况之下去关闭数据库连接,这样就造成了资源泄漏,数据库连接会因为这处代码逐步被耗尽。