请调用此方法:
->
simpleJdbcTemplate.queryForInt(SQL,null);
->
spring queryForInt()
中的 SimpleJdbcTemplate
方法抛出DataAccessException
,这是一个运行时异常。我希望推动应用程序的视图层的异常,因为Spring框架工作包裹了RuntimeExceptions
里面的已检查异常我被困在这里。
我该怎么做?
解释1:
Spring Framework的JDBC抽象框架提供的增值 - 他们说Spring Framework会处理除3和6之外的所有内容.3和6需要由应用程序开发人员编码
定义连接参数
打开连接
指定声明
准备并执行声明
设置循环以迭代结果(如果有的话)
为每次迭代完成工作
处理任何异常
处理交易
关闭连接
但是,如果我遇到一个情况,在程序启动一段时间后,数据库的连接会丢失。然后在调用上面的方法时抛出运行时异常。因为我没有处理异常我无法通知用户界面(视图)。
答案 0 :(得分:7)
仅仅因为Spring抛出运行时异常并不意味着你无法捕获它。如果你想为DataAccessExceptions做一些特别的事情,你当然可以这样做:
try {
// query logic
} catch (DataAccessException ex) {
// handle the exception
}
如果您正在使用Spring的MVC框架,那么可能需要查看ExceptionResolver接口。它是一种机制,用于决定如何处理应用程序较低层抛出的所有未捕获的异常。它为您提供了最后一次机会,可以根据抛出的异常显示不同的视图。
答案 1 :(得分:1)
这取决于您的视图层是否捕获已检查的异常(throwable的任何子类,它不是RuntimeException或Error的子类,或者不是RuntimeException或Error的实例)或未经检查的异常(RuntimeException或Errors或这些Throwable子类的子类)。
一般来说,你要么拥有这样的东西:
try {
//... processing
} catch(Exception/RuntimeException e) {
// propagate the exception to the view in a meaningful manner
}
如果是这种情况,对于运行时异常,您不必执行任何操作 - 该块将捕获运行时异常。
如果要将其转换为选中,假设您使用的是支持包装异常的Java版本,您只需要:
try {
//...spring code
} catch(DataAccessException e) {
throw new Exception(e);
}
然后,此处理上方的图层会将其作为已检查的异常捕获。
答案 2 :(得分:1)
您是否希望能够在View中访问原始异常信息?如果是这样,您应该能够在RuntimeException上调用getCause()以获取导致它的基础检查异常。否则,您需要向使用SimpleJdbcTemplate的方法添加“throws”声明,捕获DataAccessException并重新抛出已包装的已检查异常。