Kotlin-result - функциональный подход к обработке ошибок в Kotlin

05 сен 2025
1,258
80
13
3 месяца

Представьте: ваш код выполняет цепочку операций, и где-то посередине что-то идёт не так. Традиционный подход — исключения — часто превращает отладку в квест по поиску того места, где же на самом деле произошла ошибка. Вот тут-то и приходит на помощь kotlin-result.

Что такое kotlin-result?

Это мультиплатформенная библиотека для Kotlin, которая реализует функциональный подход к обработке ошибок через Result-монаду. Вместо того чтобы бросать исключения или возвращать null, ваши функции начинают явно возвращать либо успешный результат (Ok(value)), либо ошибку (Err(error)).

Кому это нужно?

  • Разработчикам, уставшим от непредсказуемых исключений
  • Тем, кто хочет сделать потоки ошибок в приложении явными и предсказуемыми
  • Командам, переходящим с языков вроде Rust или Haskell, где Result — стандартный подход

5 причин попробовать kotlin-result

  1. Ясный поток выполнения Ваш код превращается в "железнодорожные пути" (Railway Oriented Programming), где чётко видно, где "хэппи-пэйс", а где обработка ошибок.
fun validateUser(input: String): Result<User, ValidationError> {
    return parseInput(input)
        .andThen(::validateEmail)
        .andThen(::checkEmailUniqueness)
}
  1. Нулевые накладные расходы Благодаря inline-классам Kotlin, на "хэппи-пэйсе" нет дополнительных аллокаций объектов.

  2. Удобные трансформации Легко преобразовывайте результаты и ошибки:

    Реклама
fetchUserData()
    .map { it.toDomainModel() } // преобразуем успешный результат
    .mapError { ApiError(it.message) } // преобразуем ошибку
  1. Мультиплатформенность Работает на всех платформах Kotlin: JVM, JS, Native (включая iOS и Android).

  2. Корутины и асинхронность Специальный модуль для работы с корутинами:

suspend fun loadData(): Result<Data, Error> = coroutineBinding {
    val a = fetchA().bind() // если здесь ошибка, дальше выполнение не пойдёт
    val b = fetchB().bind()
    combineData(a, b)
}

Под капотом

Библиотека использует несколько интересных технических решений:

  • Inline-классы для минимизации накладных расходов
  • Единый интерфейс для всех платформ
  • Полная поддержка null-safety Kotlin
  • Более 100 unit-тестов

Когда особенно полезно?

  1. Веб-сервисы — явная обработка ошибок API
  2. Бизнес-логика — чёткое разделение успешных и ошибочных сценариев
  3. Мобильная разработка — унифицированная обработка ошибок на всех платформах
  4. Работа с легаси-кодом — постепенный перевод исключений на Result

Альтернативы

В стандартной библиотеке Kotlin есть похожие механизмы (Result, runCatching), но kotlin-result предлагает:

  • Более богатый API (как в Rust/Elm)
  • Лучшую мультиплатформенную поддержку
  • Более гибкую работу с типами ошибок

Как начать использовать?

Добавьте зависимость в build.gradle.kts:

dependencies {
    implementation("com.michael-bull.kotlin-result:kotlin-result:2.1.0")
    // для корутин:
    implementation("com.michael-bull.kotlin-result:kotlin-result-coroutines:2.1.0")
}

Kotlin-result — это не просто ещё одна библиотека, а целая философия написания надёжного кода. Если вы:

  • Хотите сделать обработку ошибок предсказуемой
  • Любите функциональный подход
  • Работаете с мультиплатформенными проектами

...то стоит попробовать kotlin-result прямо сейчас. Первое время будет непривычно, но когда "щёлкнет", обратного пути уже не будет.

P.S. Полный пример использования с Ktor можно найти в репозитории проекта.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.