Ответ вслух Middle Исключения спрашивают часто обновлено

Checked или unchecked

Вопрос

Когда вы используете checked-исключения, а когда unchecked? Как обычно строите обработку ошибок в сервисе?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Checked-исключение заставляет вызывающего его обработать, это оправдано, когда сбой ожидаем и с ним реально можно что-то сделать: файл не найден, предложить другой путь. Ошибки программиста вроде null или неверного аргумента unchecked.

Что должно прозвучать в ответе

  • Checked: ожидаемый внешний сбой, который вызывающий реально обработает

  • Unchecked: ошибки программиста и неустранимые ситуации

  • Checked плохо работают с лямбдами и протекают через слои

  • Свои доменные исключения, наследники RuntimeException, с cause

  • Обработка в одном месте: глобальный обработчик, перевод в HTTP-ответ

  • Не глотать, логировать один раз

Что могут спросить следом

  • Почему Spring переводит SQLException в DataAccessException?
  • Как вы обрабатываете исключения в стримах?

Разбор

Checked-исключение заставляет вызывающего его обработать, это оправдано, когда сбой ожидаем и с ним реально можно что-то сделать: файл не найден, предложить другой путь. Ошибки программиста вроде null или неверного аргумента unchecked. На практике в сервисах я делаю доменные исключения наследниками RuntimeException: checked плохо сочетаются с лямбдами и стримами и заставляют каждый слой писать throws. Всегда передаю cause, чтобы не потерять исходную ошибку. Обработка централизована: в Spring это @RestControllerAdvice, который переводит исключения в HTTP-ответы. Логирую один раз, там, где обрабатываю, а не на каждом уровне. Пустых catch не допускаю, InterruptedException обрабатываю с восстановлением флага.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.