Spring Framework在RuntimeException中包含已检查的异常

时间:2009-05-14 17:52:39

标签: java spring exception runtime

请调用此方法:

   ->
    simpleJdbcTemplate.queryForInt(SQL,null);
   ->
spring queryForInt()中的

SimpleJdbcTemplate方法抛出DataAccessException,这是一个运行时异常。我希望推动应用程序的视图层的异常,因为Spring框架工作包裹了RuntimeExceptions里面的已检查异常我被困在这里。

我该怎么做?

解释1:

Spring Framework的JDBC抽象框架提供的增值 - 他们说Spring Framework会处理除3和6之外的所有内容.3和6需要由应用程序开发人员编码

  1. 定义连接参数

  2. 打开连接

  3. 指定声明

  4. 准备并执行声明

  5. 设置循环以迭代结果(如果有的话)

  6. 为每次迭代完成工作

  7. 处理任何异常

  8. 处理交易

  9. 关闭连接

  10. 但是,如果我遇到一个情况,在程序启动一段时间后,数据库的连接会丢失。然后在调用上面的方法时抛出运行时异常。因为我没有处理异常我无法通知用户界面(视图)。

3 个答案:

答案 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并重新抛出已包装的已检查异常。