我们可以处理从dao层到表示层的异常,而不会影响服务层(在服务层中没有修改)

时间:2018-06-09 19:44:55

标签: java model-view-controller

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

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

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

class Controller{
  method1(){}
}

class service(){
  method1Serice(){}
}

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

4 个答案:

答案 0 :(得分:0)

您可以让DAO类抛出未经检查的异常。 (RuntimeException的任何子类都可以)。您可以创建自己的自定义例外或使用任何预定义的例外。只需确保Service无法抓住Throwable,您就可以Controller抓住它。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

也许您正在寻找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会携带一些有意义的消息,这些消息可用于执行恢复或让调用者明确地正确处理它。尽量不要直接避免它,因为它在那里。

答案 3 :(得分:-1)

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