Как обрабатывать исключения в блоке catch на проекте
Что проверяют
Есть ли у вас осознанные правила работы с исключениями, а не привычка оборачивать всё в catch (Exception e). Интервьюер хочет услышать, где на проекте ловят ошибки, как их логируют и что уходит клиенту. Следом часто спрашивают про checked и unchecked и про откат транзакций.
Как отвечать
Опишите правила, по которым работала команда, и подкрепите их случаем из проекта:
- ловить там, где можно что-то сделать: повторить запрос, подставить значение по умолчанию, перевести ошибку в термины своего слоя. Если делать нечего, исключение пробрасывают дальше;
- заворачивать с причиной:
throw new PaymentException("Не удалось списать заказ " + id, e). Безeв конструкторе стектрейс исходной ошибки теряется; - логировать один раз: либо обработал и залогировал, либо пробросил. Схема «залогировал и пробросил» даёт одну ошибку пять раз в логах. В SLF4J исключение передают последним аргументом:
log.error("Заказ {} не списан", id, e); - единая точка на границе: в Spring это
@RestControllerAdviceс@ExceptionHandlerи ответ в форматеProblemDetail, без стектрейса наружу; - try-with-resources: исключение из
close()не затирает основное, а попадает вgetSuppressed(); InterruptedException: после перехвата восстанавливают флаг вызовомThread.currentThread().interrupt().
Сильный ответ содержит пример: какую ошибку ловили, почему именно там, как это помогло разбирать инциденты. Если единых правил на проекте не было, честно скажите об этом и опишите, какие ввели бы и почему.
Где спотыкаются
Глотают исключение пустым catch или печатают e.printStackTrace(). На проде ошибка исчезает из логов, а данные остаются в неконсистентном состоянии.
Ловят исключение внутри метода с @Transactional и не пробрасывают. Spring о нём не узнаёт, и транзакция фиксируется. Кроме того, по умолчанию откат происходит только на unchecked исключениях, для checked нужен rollbackFor.
Перехватывают NullPointerException или ArithmeticException как штатный сценарий. Это ошибки в коде, их исправляют проверкой, а не catch.