try-catch-finally

Тема дорожной карты · Java

try-catch в Java — это основная конструкция обработки исключений, разделяющая нормальный поток выполнения от логики обработки ошибок, позволяющая JVM-приложениям корректно восстанавливаться после сбоев во время выполнения без завершения всей программы. Блок try охватывает код, который может бросить проверяемое или непроверяемое исключение; один или несколько блоков catch(ExceptionType e) следуют за ним для обработки конкретных типов исключений в порядке от наиболее специфичного к наиболее общему; а необязательный блок finally гарантирует выполнение — успешное или неуспешное — для задач очистки, таких как закрытие JDBC-соединений или освобождение блокировок. try-catch в Java поддерживает синтаксис множественного перехвата (catch (IOException | SQLException e)) из Java 7, устраняющий дублированный код обработчика, когда несколько типов исключений требуют одного и того же ответа — паттерн, распространённый в обработке ошибок JDBC и NIO. Проверяемые исключения (подклассы Exception, но не RuntimeException) должны быть либо перехвачены через try-catch, либо объявлены в сигнатуре метода через throws, принудительно обеспечивая на этапе компиляции, что вызывающие признают восстановимые сбои; непроверяемые исключения (подклассы RuntimeException и Error) свободно распространяются вверх по стеку вызовов. Для управления ресурсами try-catch в Java заменяется конструкцией try-with-resources при работе с AutoCloseable-объектами, однако простой паттерн try-catch остаётся незаменимым для трансляции исключений в сервисном слое Spring, обработки исключений персистентности Hibernate и восстановления от ошибок на уровне домена с использованием пользовательских иерархий исключений.

Как это работает

try-catch-finally делится на checked (нужно объявить или обработать — IOException, SQLException) и unchecked (RuntimeException — NullPointerException, IllegalArgumentException). try { } catch (...) { } finally { } или try-with-resources (try (var x = ...) { }) для AutoCloseable-типов — рекомендуется для файлов/сокетов/соединений. Multi-catch (catch (IOException | SQLException e)) сокращает дублирование. Всегда сохраняйте cause (throw new MyException(msg, cause)).

Когда применять

Checked exceptions — для восстановимых условий в API библиотек (вызывающий решает); unchecked (RuntimeException) — для программных ошибок. Оборачивайте checked exceptions на границах модулей, чтобы stack trace upstream оставался чистым. try-with-resources — для всего AutoCloseable. Логируйте с throwable (log.error("...", e)) — slf4j отформатирует со stack trace.

Типичные ошибки

Ловушки try-catch-finally: catch (Exception e) { } тихо съедает каждую ошибку (тихий убийца); checked exceptions для того, что должно быть runtime-ошибкой (многословные declarations повсюду); rewrap exception теряет cause (throw new MyException(msg) без e — stack trace пропал); finally-блок, бросающий exception (оригинальное теряется).

Связанные понятия

Полезные ресурсы