【问题标题】:Can we handle a exception from dao layer to presentation layer without impacting the service layer(no modification in service layer)我们能否在不影响服务层的情况下处理从 dao 层到表示层的异常(服务层不修改)
【发布时间】:2018-06-09 19:44:54
【问题描述】:

这个场景就像我写了一个基于 MVC 的应用程序: 控制器 - 服务 - DAO 层。现在我在 DAO 层遇到了一个异常,我想在表示层处理该异常,以便服务层不需要更改。

因为使用常规的try/catchthrows 它必须通过我不想要的服务层。

有没有更好的方法来实现它?

class Controller{
  method1(){}
}

class service(){
  method1Serice(){}
}

class DAO(){
  method1DAO(){
  // exception occurs here
}

【问题讨论】:

  • 你必须比那更好地描述你的问题

标签: java model-view-controller


【解决方案1】:

您可以让DAO 类抛出未经检查的异常。 (RuntimeException 的任何子类都可以)。您可以创建自己的自定义异常或使用任何预定义的异常。只要确保Service 没有捕获Throwable,您就可以让Controller 捕获它。

【讨论】:

    【解决方案2】:

    您可以从 RuntimeException 扩展您的异常类,这样编译器就不会抱怨异常处理。然后,您可以在表示层中捕获该异常。

    【讨论】:

      【解决方案3】:

      也许您正在寻找Controller Based Exception Handling,您可以在Exception Handling in Spring MVCError Handling for REST with Spring 中查看这些信息。

      @ExceptionHandler(YourException.class)
      public String handleException(){
          logger.info(message);
          return "database_error";
      }
      

      其实我建议你在Service-Layer中正确处理异常,并正确封装异常通过Controller-Layer返回给前端用户。

      通常,checked exceptions 会携带一些有意义的消息,这些消息可用于进行恢复或让调用者明确地正确处理它。尽量不要直接避免它,因为它就在那里。

      【讨论】:

        【解决方案4】:

        据我了解,数据访问对象 (DAO) 用于在服务器和客户端之间传输数据。我假设客户端就是您所说的表示层。换句话说,最终用户与之交互的部分。因此,DAO 应该只包含字段和访问器方法,即它不应该包含逻辑。因此,它不应包含可能引发异常的方法。所以我建议也许重新设计你的应用程序。否则,也许您可​​以提供更详细的代码?

        【讨论】:

        • 没有。 DAO 表示持久性模型。 DTO(数据传输对象)用于应用服务器的层间
        猜你喜欢
        • 2015-06-06
        • 1970-01-01
        • 2012-03-19
        • 2011-02-05
        • 2017-06-07
        • 2013-05-16
        • 2022-10-13
        • 2021-08-20
        • 2013-09-09
        相关资源
        最近更新 更多