Кейс: finally проглотил исходное исключение
В код-ревью встретился метод, закрывающий ресурс вручную в finally после try с бизнес-логикой. Исключение из try терялось без единой строки в логе — а стектрейс в проде вёл совсем не туда, где была реальная причина.
Механика проста: если try бросает исключение, а finally тоже бросает исключение (или делает return), исходное исключение из try подавляется. JVM пробрасывает наверх только то, что вылетело последним из finally.
try { connection.executeUpdate(sql); // бросает SQLException } finally { connection.close(); // тоже бросает SQLException // наружу уйдёт только это исключение }
Правильный фикс — try-with-resources: он использует suppressed exceptions, оба исключения доступны через getSuppressed() на исходном, а не молча теряются. Ручной finally с close() без try-with-resources всегда рискует подавить причину сбоя.
Один throw в finally может стереть настоящую причину падения — и объяснить это на ревью проще, чем найти постфактум в проде.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки