@DimNS на тему экзепшенов вот неплохая статья
https://habr.com/ru/post/264417/ От себя пару(счетчик сломался) пунктов:
1) У нас в пыхе слоев немного, поэтому можно и покидать исключения.
2) Исключения - это удобно. Зачастую наш код предполагает: положительный исход - или конец.
3) Где нужна более широкая гибкость - можно поиграться с ResultClass. Тут уже скорее на любителя и приверженца того или иного метода. Взять тоже го - там вообще нет исключений. Плюсы - явная обработка ошибок. Минусы- много болерплейта по обработке каждого метода.
4) никто не мешает сделать сложное исключение с набором данных помимо мессаджа.