runCatchingとResult<T>
runCatchingで例外をResultにラップし、関数型に処理します。
「runCatchingとResult<T>」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
Result<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で変換する
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とrecoverCatching
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)は、どちらの分岐からも統一された型を返します。UI向けの値に変換する場合に便利です。
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で1つの結果にまとめます。明示的なエラーパイプラインに適しています。
よくある質問
「runCatchingとResult<T>」レッスンは無料ですか?
はい。「runCatchingとResult<T>」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「runCatchingとResult<T>」で何を学びますか?
runCatchingで例外をResultにラップし、関数型に処理します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「runCatchingとResult<T>」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 式としてのtry/catch/finally
- カスタム例外クラスの作成
- runCatchingとResult
- 例外の再スローとチェーン