関数型エラーハンドリング
マッピングと復旧を学びます
「関数型エラーハンドリング」は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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Result型
- runCatching
- SealedなResult階層
- 関数型エラーハンドリング