Как обрабатываются ошибки
Что проверяют
Вопрос широкий, и интервьюер смотрит, на каком уровне вы ответите: только синтаксис try/catch или ещё и путь ошибки через слои приложения. Следом почти всегда спрашивают про checked и unchecked и о том, как исключение превращается в HTTP-ответ.
Как отвечать
Начните с иерархии. Всё выбрасываемое наследует Throwable, от него идут Error (сбои JVM вроде OutOfMemoryError, их не ловят) и Exception. Наследники RuntimeException непроверяемые, остальные исключения компилятор требует поймать или объявить в throws.
Средства языка:
try/catch/finallyи мультикэтчcatch (IOException | SQLException e);- try-with-resources: всё с
AutoCloseableзакрывается само, а исключение изclose()не затирает основное и попадает вgetSuppressed(); - обёртка с причиной:
new OrderException(msg, e)сохраняет исходный стек вgetCause().
Дальше архитектура, ради неё вопрос и задают:
- доменные исключения: сервис бросает свои непроверяемые
OrderNotFoundException, а не протаскиваетSQLExceptionиз репозитория наверх; - обработка на границе: в Spring это
@RestControllerAdviceс методами@ExceptionHandler, которые переводят исключения в коды ответа. С Spring Framework 6 для тела ошибки естьProblemDetailпо RFC 9457; - транзакции:
@Transactionalпо умолчанию откатывается наRuntimeExceptionиError, а на проверяемом исключении коммитит. Нужен откат, указывайтеrollbackFor; - логирование один раз: там, где ошибку окончательно обработали, а не на каждом слое перед пробросом.
Ожидаемые бизнес-исходы (не хватило денег, товар закончился) бывает удобнее вернуть результатом: sealed interface с вариантами и разбор через switch с шаблонами из Java 21.
Где спотыкаются
Ловят Exception и глотают его пустым catch или одним printStackTrace(). Ошибка исчезает, система работает дальше в испорченном состоянии.
Пишут return внутри finally. Он молча подменяет и результат, и выброшенное исключение.
Ловят InterruptedException и не восстанавливают флаг через Thread.currentThread().interrupt(). Код выше по стеку не узнает, что поток просили остановиться.