Я работаю над проектом с устаревшим сервисным уровнем, который возвращает null во многих местах, если запрошенная запись не существует или недоступна из-за того, что вызывающая сторона не авторизована. Я говорю о конкретных запрошенных ID записях. Например, что-то вроде:
UserService.get(userId);
Недавно я настаивал на том, чтобы этот API был изменен или дополнен новым API, который вместо этого генерирует исключения. Последовали дебаты о проверенных и непроверенных исключениях.
Принимая к сведению разработчиков JPA/Hibernate и др., я предположил, что непроверенные исключения могут быть наиболее подходящими. Мой аргумент заключается в том, что нельзя разумно ожидать, что пользователи API восстановятся после этих исключений, и в 99% случаев мы можем в лучшем случае уведомить пользователя приложения о возникновении некоторой ошибки.
Распространение исключений во время выполнения до универсальных механизмов обработки, очевидно, значительно уменьшит сложность и необходимость обработки ветвей, связанных с обработкой крайних исключений. Но такой подход вызывает много беспокойства (и это правильно).
Почему разработчики таких проектов, как JPA/EJB и Hibernate, выбрали модель неконтролируемых исключений? Есть ли для этого очень хорошее обоснование? Какие плюсы/минусы. Должны ли разработчики, использующие эти фреймворки, по-прежнему обрабатывать исключения времени выполнения рядом с тем местом, где они возникают, с помощью чего-то вроде оболочек адаптера?
Я надеюсь, что ответы на эти вопросы помогут нам принять «правильное» решение относительно нашего собственного сервисного уровня.