Kotlin реализует обработку исключений (exception handling) схоже с Java, но с важными отличиями. В Kotlin используются знакомые конструкции try, catch, и finally, однако принципиальное отличие — в Kotlin отсутствуют checked exceptions. Это значит, что все исключения (ошибки времени выполнения) считаются unchecked — их не требуется объявлять в сигнатуре функции и явно перехватывать.
finally выполняется всегда, даже если выброшено исключение.try, т.е. try можно использовать как выражение, возвращая результат.try/catch для flow-control — используйте их только для truly exceptional situations.fun parseIntOrNull(str: String): Int? = try { str.toInt() } catch (e: NumberFormatException) { null }
use для автозакрытия (например, файлов).В Kotlin надо ли указывать в сигнатуре функции, какие исключения она выбрасывает (как в Java — через throws)?
Правильный ответ: Нет, в Kotlin отсутствует механизм checked exceptions. Все исключения — unchecked. Не существует синтаксиса throws в сигнатуре функции (Исключение — аннотация @Throws для compatibility с Java, только для interop).
История
На проекте мигрировали Java-код с использованием checked exceptions (например,
IOException). После миграции на Kotlin разработчик забыл обработать исключение при работе с файлами — приложение начало крашиться на реальных файлах, потому что никто не обрабатывал IO-ошибки, считая, что компилятор предупредит, как в Java.
История
Один из членов команды ошибочно использовал try/catch для flow-control и замедлил работу парсинга логов (ловил NumberFormatException для каждой невалидной строки — performance резко просел на большом объёме данных).
История
В проекте для JVM через Kotlin вызывался Java-код, который объявлял checked exceptions (
throws). Kotlin-код не обрабатывал исключения, считая, что "всё unchecked" — в результате критическая ошибка ушла незамеченной вплоть до продуктивного инцидента.