0Pricing
Kotlin Academy · Урок

try/catch/finally как выражение

Используйте try-catch как выражение, возвращающее значения из кода, подверженного ошибкам.

«try/catch/finally как выражение» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Конструкция обработки исключений как выражение

В Kotlin конструкция try/catch является выражением и возвращает значение. Результатом становится последнее выражение в блоке try или catch.

Базовая обработка исключений

Поместите код, который может выбросить исключение, в блок try; обрабатывайте исключения в catch.

fun main() {
    try {
        val n = "abc".toInt()
        println(n)
    } catch (e: NumberFormatException) {
        println("Not a number: ${e.message}")
    }
}

Конструкция обработки исключений возвращает значение

Присвойте результат конструкции try/catch переменной. Значением будет результат выполнения соответствующего блока.

fun main() {
    val n: Int = try {
        "42".toInt()
    } catch (e: NumberFormatException) {
        -1
    }
    println(n) // 42
}

Обработка исключений в теле функции

Можно использовать try как тело функции с выражением в качестве тела.

fun parseOrDefault(s: String, default: Int): Int = try {
    s.toInt()
} catch (e: NumberFormatException) {
    default
}
fun main() {
    println(parseOrDefault("42", 0))   // 42
    println(parseOrDefault("abc", 0))  // 0
}

Несколько блоков обработки исключений

Перечислите несколько блоков catch для разных типов исключений. Срабатывает первое совпадение.

fun main() {
    val result: String = try {
        val list = listOf(1)
        list[5].toString()
    } catch (e: IndexOutOfBoundsException) {
        "index out of bounds"
    } catch (e: Exception) {
        "other error"
    }
    println(result)
}

Завершающий блок

finally выполняется всегда и используется для очистки ресурсов. Он НЕ влияет на возвращаемое значение выражения с обработкой исключений.

fun main() {
    val n: Int = try {
        "42".toInt()
    } catch (e: NumberFormatException) {
        -1
    } finally {
        println("cleanup runs")
    }
    println("value = $n")
}

Обработка исключений с несколькими инструкциями

Используйте блок с несколькими инструкциями; его значением будет последнее выражение.

fun main() {
    val result: String = try {
        val n = 10 / 2
        val s = "Result is $n"
        s.uppercase()
    } catch (e: Exception) {
        "ERROR"
    }
    println(result) // RESULT IS 5
}

Перехват нескольких типов

Kotlin не поддерживает синтаксис множественного перехвата исключений из Java (catch (A | B)). Используйте общий супертип или отдельные блоки обработки исключений.

fun parse(s: String): Int = try {
    s.toInt()
} catch (e: RuntimeException) { // covers NumberFormatException etc.
    -1
}
fun main() {
    println(parse("42"))
    println(parse("nope"))
}

Порядок обработки исключений важен

Перечисляйте конкретные исключения перед их супертипами — иначе супертип перехватит исключение первым.

fun main() {
    try {
        throw NumberFormatException("oops")
    } catch (e: NumberFormatException) {
        println("specific: ${e.message}")
    } catch (e: Exception) {
        println("generic")
    }
}

Возврат из блока обработки

Из блока try можно выполнить досрочный возврат — блок finally всё равно выполнится.

fun process(x: Int): String {
    return try {
        require(x > 0) { "must be positive" }
        "ok: $x"
    } catch (e: IllegalArgumentException) {
        "error: ${e.message}"
    } finally {
        println("processing done")
    }
}
fun main() {
    println(process(5))
    println(process(-1))
}

Антипаттерн: пустой блок обработки

Пустые блоки catch скрывают ошибки. Как минимум зарегистрируйте исключение в журнале или выбросьте его повторно.

fun main() {
    try {
        "abc".toInt()
    } catch (e: NumberFormatException) {
        // BAD: silently swallow
    }
    println("continued")
}

Быстрая проверка

Что возвращает выражение try/catch в Kotlin?

Итоги

try/catch — это выражение, возвращающее значение. Перечисляйте конкретные исключения перед супертипами, используйте finally для очистки ресурсов и избегайте пустых блоков обработки исключений. Используйте его как тело функции или для назначения значения по умолчанию при ошибке.

Часто задаваемые вопросы

Урок «try/catch/finally как выражение» бесплатный?

Да — полный текст урока «try/catch/finally как выражение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «try/catch/finally как выражение»?

Используйте try-catch как выражение, возвращающее значения из кода, подверженного ошибкам. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «try/catch/finally как выражение»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. try/catch/finally как выражение
  2. Создание пользовательских классов исключений
  3. runCatching и Result
  4. Повторный выброс и связывание исключений
← Назад к Kotlin Academy