@maxvinogradov

Стоит ли бросать кастомные ошибки, если этити не найдено в API?

Думаю, стоит ли кидать свои собственные эксепшены, если что-то не найдено. С одной стороны, это логично и не будет ошибок от Spring data JPA вроде EntityNotFoundException и куда менее понятных ошибок. Но с другой стороны, если с фронта все правильно настроено, то таких ситуаций и не должно быть. Еще и джава будет конкатенировать стринги, которые я передаю в ошибку, даже если ошибки не произошло.

Я только учусь и не понимаю, вот пример двух вариантов кода.

Первый, меня в нем беспокоит только конкатенация строк.

public VoteDTO getByid(int voteId) {
        Vote vote = voteRepository.getById(voteId);
        Optional<Vote> voteOptional = voteRepository.findById(voteId);
        if(voteOptional.isEmpty()) {
            throw new ApiException("Vote with id " + id  + 
                    "is not in DB");
        }
    return toVoteDto(voteOptional.get());
}

И второй без такой проверки ( Spring будет кидать свои эксепшены, если Entity не найдено, но является ли это проблемой? )

public VoteDTO getByid(int voteId) {
    Vote vote = voteRepository.getById(voteId);
    return toVoteDto(vote);
}
  • Вопрос задан
  • 341 просмотр
Решения вопроса 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день!
Наверное, это зависит от того, как вы в команде договоритесь.
Вы можете выбрасывать кастомные эксепшены, а далее ловить их в Controller или ControllerAdvice и отдавать соответствующее сообщение на клиент с кодом ошибки.
Также можно обернуть entity в Optional и выбрасывать исключение orElseThrow() или возвращать другой объект (orElse()) или новый объект и т.д.

Optional<Vote> voteOptional = voteRepository.findById(voteId);
        if(voteOptional.isEmpty()) {
            throw new ApiException("Vote with id " + id  + 
                    "is not in DB");
        }

Можно же упростить:
Vote vote = voteRepository.findById(voteId).orElseThrow(VoteNotFoundException::new);


Но с другой стороны, если с фронта все правильно настроено, то таких ситуаций и не должно быть.

не нужно надеяться на клиент. Например, человек может сам совершить запрос при помощи Postman и передать некорректное значение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
LaRN
@LaRN
Senior Developer
Своей класс исключения имеет смысл бросать, если у вас для этого класса описан хэндленр, который сформиует правильный по бизнесу http ответ например.
Вот тут описано как это делать
https://spring.io/blog/2013/11/01/exception-handli...

А строки не обязательно конкатенировать, можно использовать StringBuilder или String.format() например.
Ответ написан
BorLaze
@BorLaze
Java developer
Стоит ли бросать кастомные ошибки

Да. Фронту совершенно не нужно знать, что там и как на уровне репозитария организовано.

меня в нем беспокоит только конкатенация строк

Так не конкатенируй.

Используй String.format()
throw new ApiException(String.format("Vote with id %d is not in DB", voteId));

либо, если ApiException твой, спрячь эту логику вообще в конструктор
public ApiException(String format, Object... parameters) {
    ...
}

и бросай исключение как
throw new ApiException("Vote with id %d is not in DB", voteId);
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
беспокоит только конкатенация строк

...
кидает исключение в бизнес-логике

Л - Логика.

Сбор стектрейса при выбросе исключения - это гораздо, гораздо более затратно, чем любая конкатенация строк.
Не нужно использовать исключения для бизнес-логики! Ненайденая сущность - это не исключительная, а штатная ситуация.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы