如何在 Java DAO 中管理异常?

How to manage exceptions in a Java DAO?

我正在 Java 编写我的第一个 DAO,我想知道如何管理可能发生的异常:

我当前的代码:

public void update(User userUpdate) throws Exception {

    try (Connection dbConnection = ConnectionManager.getConnection(); PreparedStatement preparedStatement = dbConnection.prepareStatement(QUERY_UPDATE);) {

        int userId = userUpdate.getId();
        String userName = userUpdate.getName();
        String userMail = userUpdate.getEmail();
        String userPassword = userUpdate.getPassword();
        int userIdRole = userUpdate.getRole().getId_role();

        preparedStatement.setString(1, userName);
        preparedStatement.setString(2, userMail);
        preparedStatement.setString(3, userPassword);
        preparedStatement.setInt(4, userIdRole);
        preparedStatement.setInt(5, userId);

        int updatedRows = preparedStatement.executeUpdate();

        if (updatedRows != 1) {

        throw new Exception("We had a problem updating your details");

        }
    }
    }

我不知道如何管理异常。调用这个方法的控制器有一个 catch 块来从 DAO 方法中获取异常,但是,我必须将什么样的异常发送回控制器,只是全局的? SQL 还有一个吗?

我是否必须在 DAO 方法中捕获某些内容(并创建反馈以将其发送给用户)或者只是将异常抛给控制器并让它们单独处理反馈?

谢谢!!

通常您会尝试从应用程序代码中封装特定的 IO 异常,例如 SQLException。因此,如果您使用一些通用的 DAO 构建一个简单的 CRUD 应用程序,您可以将 SQLException 映射到更具体的异常,例如 catch-clause 中的 UpdateFailedException() 并将此异常委托给控制器。根据您用于表示逻辑的框架或库,您可以使用类似全局错误处理程序的东西将此特定异常类型映射到 HTTP 响应代码(某些 crud 框架对此提供支持)。另一个问题是,当没有数据更新时,它真的是一个异常吗?如果没有更新数据,则没有找到给定的用户,您可以使用先决条件进行检查,并可能引发 NotFoundException,例如映射到 404 Http 代码。或者如果用户不在数据库中而不抛出异常,则只需创建一个。最后它可能看起来像这样:

public class Controller {

    public HttpResponse updateUserAction(User user) {
        try {
            userDao.update(User user);
            return new HttpResonse(200, "User has been updated.");

        } catch (UpdateException ex) {
            return new HttpResponse(500, ex.getMessage());
        } catch (NotFoundException ex) {
            return new HttpResponse(404, ex.getMessage());
        }
    }
}

public class UserDao {

    public void update(User userUpdate) throws NotFoundException, UpdateException {

        try (Connection dbConnection = ConnectionManager.getConnection(); PreparedStatement preparedStatement = dbConnection.prepareStatement(QUERY_UPDATE);) {

            //check if user exists pseudocode
            if (this.get(userUpdate.getId()) == null) throw new NotFoundException("User not found");

            int userId = userUpdate.getId();
            String userName = userUpdate.getName();
            String userMail = userUpdate.getEmail();
            String userPassword = userUpdate.getPassword();
            int userIdRole = userUpdate.getRole().getId_role();

            preparedStatement.setString(1, userName);
            preparedStatement.setString(2, userMail);
            preparedStatement.setString(3, userPassword);
            preparedStatement.setInt(4, userIdRole);
            preparedStatement.setInt(5, userId);

            preparedStatement.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new UpdateException();
        } catch (UpdateException ex) {
            ex.prinntStackTrace();
            throw ex;
        }
    }
}