0Pricing
Kotlin Academy · Урок

runCatching и Result<T>

Используйте runCatching, чтобы оборачивать исключения в Result и обрабатывать их функционально.

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

Результат<T> вкратце

Result<T> — это оболочка Kotlin для результата операции: либо успешное выполнение со значением типа T, либо ошибка с объектом типа Throwable.

Основы runCatching

runCatching { ... } выполняет блок и оборачивает результат в Result.

fun main() {
    val good = runCatching { 10 / 2 }
    val bad  = runCatching { 10 / 0 }
    println("good isSuccess = ${good.isSuccess}")
    println("bad isFailure  = ${bad.isFailure}")
}

Извлечение значения

getOrNull возвращает значение или null. getOrThrow повторно выбрасывает исключение при ошибке. getOrDefault возвращает резервное значение.

fun main() {
    val r = runCatching { "42".toInt() }
    println(r.getOrNull())          // 42
    println(r.getOrDefault(-1))    // 42
    val bad = runCatching { "x".toInt() }
    println(bad.getOrNull())       // null
    println(bad.getOrDefault(0))   // 0
}

Извлечение исключения

exceptionOrNull() возвращает исключение при ошибке или null при успешном выполнении.

fun main() {
    val r = runCatching { error("boom") }
    println(r.exceptionOrNull()?.message) // boom
}

Преобразование значения

map { value -> ... } преобразует значение успешного результата. Ошибка передаётся без изменений.

fun main() {
    val r = runCatching { "10" }.map { it.toInt() * 2 }
    println(r.getOrNull()) // 20
}

mapCatching

mapCatching оборачивает преобразование в try/catch, поэтому исключения внутри лямбды также становятся ошибками.

fun main() {
    val r = runCatching { "abc" }.mapCatching { it.toInt() }
    println(r.isFailure) // true
    println(r.exceptionOrNull()?.message) // For input string: "abc"
}

Восстановление и обработка ошибок при восстановлении

recover { e -> fallback } превращает ошибки в успешные результаты, вычисляя значение для восстановления.

fun main() {
    val r = runCatching { "abc".toInt() }
        .recover { -1 }
    println(r.getOrNull()) // -1
}

onSuccess и onFailure

Используйте onSuccess и onFailure для побочных эффектов без изменения объекта Result.

fun main() {
    runCatching { "42".toInt() }
        .onSuccess { println("parsed: $it") }
        .onFailure { println("failed: ${it.message}") }
}

fold для обоих вариантов

fold(onSuccess, onFailure) возвращает единый тип из любой ветви — это удобно для преобразования результата в значение, готовое для интерфейса пользователя.

fun main() {
    val r = runCatching { "10".toInt() }
    val msg: String = r.fold(
        onSuccess = { "OK: $it" },
        onFailure = { "ERR: ${it.message}" }
    )
    println(msg)
}

Использование Result как возвращаемого типа

Функции могут возвращать Result<T>, делая обработку ошибок явной в месте вызова.

fun parseInt(s: String): Result<Int> = runCatching { s.toInt() }
fun main() {
    parseInt("42").onSuccess { println("got $it") }
    parseInt("xx").onFailure { println("oops: ${it.message}") }
}

Цепочка операций

Объединяйте runCatching с map, mapCatching и recover в единую цепочку обработки ошибок.

fun fetchUserId(): Result<Int> = runCatching { 42 }
fun loadName(id: Int): String = "User-$id"
fun main() {
    val name = fetchUserId()
        .map { loadName(it) }
        .recover { "Anonymous" }
        .getOrNull()
    println(name)
}

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

Какой конструктор выполняет блок и оборачивает результат (значение или исключение) в Result?

Итоги

Result<T> представляет успешное выполнение или ошибку. Создавайте его с помощью runCatching, преобразуйте с помощью map/mapCatching, восстанавливайте с помощью recover, наблюдайте за результатом с помощью onSuccess/onFailure и сворачивайте с помощью fold. Это отличный инструмент для явной цепочки обработки ошибок.

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

Урок «runCatching и Result<T>» бесплатный?

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

Чему я научусь в уроке «runCatching и Result<T>»?

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

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

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

Сколько времени занимает урок «runCatching и Result<T>»?

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

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

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

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

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