错误代码或异常:在我的案例中如何将错误从模型传达给控制器?

Error Code or Exception: How to communicate errors from model to controller in my case?

在我的服务层中,我有一种方法可以让用户登录到系统中。此方法接收 3 个参数:String usernameString passwordint roleId

我需要在我的服务层执行几项检查:

如果这些检查中的任何一个失败,那么服务层应该告诉控制器登录失败以及失败的原因。
如果所有这些检查都通过,那么服务层应该告诉控制器登录已经通过。

我担心的是如果检查失败,我如何将它从服务层传达给控制器。我应该抛出异常吗?还是我应该发送错误代码?

我想我有这些选择:

选项 1:

每当检查失败时抛出异常。所以我的服务方式可以是:

public void login(String username, String password, int roleId) throws UserServiceException;

这可能是逻辑:

boolean check1Flag = isUserExist(username);
if (!check1Flag) {
   throw new UserServiceException("No user exist with username '" + username + "'");
}
...

选项 2:

每当检查失败时发送错误代码。如果所有这些检查都通过,则发送 0 作为代码。所以我的服务方式可以是:

public int login(String username, String password, int roleId) throws UserServiceException;

这可能是逻辑:

boolean check1Flag = isUserExist(username);
if (!check1Flag) {
   return -1; // -1 means No user exist with username paramter
}
...

选项 3:

每当检查失败时发送false。如果所有这些检查都通过,则发送 true。所以我的服务方式可以是:

public boolean login(String username, String password, int roleId) throws UserServiceException;

这可能是逻辑:

boolean check1Flag = isUserExist(username);
if (!check1Flag) {
   return false; 
}
...

选项 3 看起来很干净,但我不知道如何通知控制器在这种情况下发生了哪个错误。

还有其他选择吗?这种情况是否有任何普遍接受的设计指南?

谢谢

这是一个基于意见的问题,但您可以从 servlet 规范中借用叶子,其中 HttpServletRequest#login 方法在失败时抛出 ServletException。原因很明显:

  1. 一种错误处理范式,大体上适合JavaEE的一般异常处理机制。您可以使用像 <error-page> 这样的普通 JavaEE 结构和您可以在 CDI 和 JSF

  2. 中找到的全局执行处理机制来处理您的异常
  3. 一个紧凑的通讯包。您的异常可以明确传达

    • 请求失败 (#3)
    • 一条异常消息,可能更加人性化
    • 上下文特定异常-class名称

我想这取决于你是否需要控制器中的信息。

例如,如果它是某种网站,并且登录控制器将只显示用户 "Login failed" 屏幕,那么我会选择 选项 3。如果你愿意,你也可以在服务层记录错误。

如果您需要登录控制器针对不同的错误采取不同的操作。例如说 "You don't have the role" 或 "Your account is locked",那么我会选择 选项 2。也许您可以制作一个响应枚举或类似的东西而不是整数以使代码清晰。

我不会选择选项 1,因为我不喜欢将异常用于常见场景处理。此外,由于您想知道控制器中发生了什么,您无论如何都需要在异常中添加一些整数或枚举代码或解析异常消息。