Kotlin Academy · レッスン

関数型エラーハンドリング

マッピングと復旧を学びます

レッスン 4/413 ステップ

「関数型エラーハンドリング」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

データフローとしてのエラー

関数型エラー処理では、失敗を成功した値と同じように変換、連鎖し、そこから復旧できる値として扱います。組み込みの Result は、まさにそのための演算子を提供します。

map

map は成功した値を変換し、失敗は変更せず、そのまま伝播させます。

fun main() {
    val r = Result.success(5).map { it * 2 }
    println(r.getOrNull())
    val f = Result.failure<Int>(Exception("x")).map { it * 2 }
    println(f.getOrNull())
}

mapCatching

変換自体が例外をスローする可能性がある場合、mapCatching はその例外を結果に取り込み、外部へ伝播させません。

fun main() {
    val r = Result.success("10").mapCatching { it.toInt() }
    println(r.getOrNull())
    val bad = Result.success("oops").mapCatching { it.toInt() }
    println(bad.isFailure)
}

recover

recover は、例外から値を計算することで失敗を成功に戻します。成功の場合は変更せずに通過させます。

fun main() {
    val r = Result.failure<Int>(Exception("down")).recover { 0 }
    println(r.getOrNull())
    val ok = Result.success(7).recover { 0 }
    println(ok.getOrNull())
}

recoverCatching

復旧処理自体も失敗する可能性がある場合、recoverCatching はその試行をラップし、すべてを結果として保持します。

fun main() {
    val r = Result.failure<Int>(Exception()).recoverCatching {
        "5".toInt()
    }
    println(r.getOrNull())
}

onSuccess と onFailure

これらは結果を変更せずに副作用を実行し、さらなるチェーンのために結果を返します。ログ出力に適しています。

fun main() {
    runCatching { "3".toInt() }
        .onSuccess { println("ok " + it) }
        .onFailure { println("fail " + it.message) }
        .also { println("done") }
}

パイプラインを連結する

演算子を組み合わせると、ネストした try/catch なしに、取得、変換、回復を行うすっきりしたパイプラインを構成できます。

fun main() {
    val result = runCatching { "21".toInt() }
        .map { it * 2 }
        .recover { -1 }
        .getOrThrow()
    println(result)
}

foldで最終値にまとめる

パイプラインの最後で fold を使用すると、両方の分岐を、ユーザーに表示するメッセージなどの1つの具体的な値にまとめられます。

fun main() {
    val msg = runCatching { "x".toInt() }
        .map { it + 1 }
        .fold(
            onSuccess = { "result: " + it },
            onFailure = { "failed: " + it.message }
        )
    println(msg)
}

カスタム型に対するマッピング

map のような拡張関数を記述すれば、独自の sealed 結果型にも同じ使いやすさを持たせられます。

sealed class Res<out T> {
    data class Ok<T>(val v: T) : Res<T>()
    data class Err(val msg: String) : Res<Nothing>()
}

fun <T, R> Res<T>.map(f: (T) -> R): Res<R> = when (this) {
    is Res.Ok -> Res.Ok(f(v))
    is Res.Err -> this
}

fun main() {
    val r = Res.Ok(4).map { it * 3 }
    println(r)
}

関数型スタイルの理由

関数型のエラーハンドリングでは、エラーが宣言的に流れるため、正常系の処理を読みやすく保てます。try/catch が分散することもなく、型システムによって処理の最初から最後まで失敗を追跡できます。

すべてを組み合わせる

これで一通りのツールがそろいました:

  • map / mapCatching で変換
  • recover / recoverCatching で回復
  • onSuccess / onFailure で副作用を実行
  • fold で最終化

理解度チェック

関数型のエラーハンドリングについての理解度を確認しましょう。

まとめ

関数型のエラーハンドリングについて学びました:

  • map / mapCatching で変換する
  • recover / recoverCatching で回復する
  • onSuccess / onFailure で状態を確認する
  • fold で最終化する

これでResultとエラーモデリングのコースは完了です。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「関数型エラーハンドリング」レッスンは無料ですか?

はい。「関数型エラーハンドリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「関数型エラーハンドリング」で何を学びますか?

マッピングと復旧を学びます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「関数型エラーハンドリング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Result型
  2. runCatching
  3. SealedなResult階層
  4. 関数型エラーハンドリング
← Kotlin Academyに戻る