Как управлять исключениями в Java DAO? - PullRequest
0 голосов
/ 04 августа 2020

Я кодирую свой первый DAO в Java, и мне интересно, как управлять исключениями, которые могут возникать:

Мой текущий код:

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 (и создать обратную связь для отправки пользователю) или просто передать исключения контроллеру и оставить их в покое с обратной связью?

Спасибо !!

1 Ответ

0 голосов
/ 04 августа 2020

Обычно вы пытаетесь инкапсулировать определенные c исключения ввода-вывода, такие как SQLException, из кода вашего приложения. Так что, если вы создаете простое приложение CRUD с некоторыми типами c DAO, вы можете сопоставить SQLException, например, с более конкретными c исключениями, такими как UpdateFailedException () в предложении catch, и делегировать это исключение контроллеру. В зависимости от того, какую платформу или библиотеку вы используете для c презентации logi, вы можете сопоставить эти специфические c типы исключений с кодами 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;
        }
    }
}
...