【问题标题】:Spring Frame work Wraps Checked Exceptions inside RuntimeExceptionsSpring Framework 在 RuntimeException 中包装了检查的异常
【发布时间】:2023-03-02 22:08:02
【问题描述】:

调用这个方法:

   ->
    simpleJdbcTemplate.queryForInt(SQL,null);
   ->

queryForInt() springs 中的方法SimpleJdbcTemplate 抛出一个DataAccessException,这是一个运行时异常。我想将异常传播到应用程序的视图层,因为 Spring 框架工作在 RuntimeExceptions 内包装了检查的异常我卡在这里。

我该怎么做?

解释一:

Spring Framework 的 JDBC 抽象框架提供的附加值——他们说 Spring Framework 负责除 3 和 6 之外的所有内容。3 和 6 需要由应用程序开发人员编码

  1. 定义连接参数

  2. 打开连接

  3. 指定语句

  4. 准备并执行语句

  5. 设置循环以遍历结果(如果有)

  6. 完成每次迭代的工作

  7. 处理任何异常

  8. 处理事务

  9. 关闭连接

但是如果我遇到在程序启动一段时间后与数据库的连接丢失的情况。那么当调用上述方法时会抛出运行时异常。由于我不处理异常我无法通知用户界面(视图)。

【问题讨论】:

  • 我不完全确定你为什么会被卡住以及你想做什么;你能澄清一下这个问题吗?

标签: java spring exception runtime


【解决方案1】:

仅仅因为 Spring 抛出运行时异常并不意味着您无法捕获它。如果你想为 DataAccessExceptions 做一些特别的事情,你当然可以这样做:

try {
    // query logic
} catch (DataAccessException ex) {
    // handle the exception
}

如果您使用 Spring 的 MVC 框架,可能值得研究 ExceptionResolver 接口。它是一种决定如何处理应用程序低层抛出的所有未捕获异常的机制。它使您有最后一次机会根据抛出的异常显示不同的视图。

【讨论】:

  • 已添加评论,以便我再次找到此答案。
【解决方案2】:

您是否只想在您的视图中访问原始异常信息?如果是这样,您应该能够在 RuntimeException 上调用 getCause() 以获取导致它的底层已检查异常。否则,您需要向使用 SimpleJdbcTemplate 的方法添加“抛出”声明,捕获 DataAccessException 并重新抛出已包装的已检查异常。

【讨论】:

    【解决方案3】:

    这取决于您的视图层是否捕获已检查的异常(任何不作为 RuntimeException 或 Error 子类的 throwable 子类,或者不是 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);
    }
    

    然后,您在此处理之上的层会将其作为已检查异常捕获。

    【讨论】:

      猜你喜欢
      • 2014-10-23
      • 1970-01-01
      • 2015-03-21
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多