Kotlin Academy · Oppitunti

runCatching ja Result<T>

Käyttäkää runCatching-funktiota poikkeusten käärimiseen Result-tyyppiin ja käsitelkää niitä funktionaalisesti.

Oppitunti 3/413 vaihetta

runCatching ja Result<T> on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Result<T> lyhyesti

Result<T> on Kotlinin säiliö operaation tulokselle: joko onnistuminen, joka sisältää tyypin T arvon, tai epäonnistuminen, joka sisältää Throwable-poikkeuksen.

runCatching-perusteet

runCatching { ... } suorittaa lohkon ja käärii tuloksen Result-arvoksi.

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

Arvon poimiminen

getOrNull palauttaa arvon tai null-arvon. getOrThrow heittää poikkeuksen uudelleen epäonnistumisen yhteydessä. getOrDefault palauttaa vara-arvon.

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
}

Poikkeuksen poimiminen

exceptionOrNull() palauttaa epäonnistumisen yhteydessä poikkeuksen tai onnistumisen yhteydessä null-arvon.

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

Muuntaminen map-funktiolla

map { value -> ... } muuntaa onnistumisen arvon. Epäonnistuminen välitetään muuttumattomana eteenpäin.

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

mapCatching

mapCatching käärii muunnoksen try/catch-rakenteeseen, joten myös lambdan sisällä syntyvät poikkeukset muuttuvat epäonnistumisiksi.

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

recover ja recoverCatching

recover { e -> fallback } muuttaa epäonnistumiset onnistumisiksi laskemalla palautusarvon.

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

onSuccess ja onFailure

Käytä onSuccess- ja onFailure-funktioita sivuvaikutuksiin muuttamatta Result-arvoa.

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

fold molemmille poluille

fold(onSuccess, onFailure) palauttaa yhtenäisen tyypin kummastakin haarasta. Tämä on hyödyllistä muunnettaessa tulos käyttöliittymälle sopivaksi arvoksi.

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

Result palautustyyppinä

Funktiot voivat palauttaa tyypin Result<T>, jolloin virheenkäsittely on kutsukohdassa yksiselitteistä.

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

Operaatioiden ketjuttaminen

Yhdistä runCatching-, map-, mapCatching- ja recover-funktioita sujuviksi virheenkäsittelyketjuiksi.

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)
}

Pikatarkistus

Mikä builder-funktio suorittaa lohkon ja käärii sen tuloksen, arvon tai poikkeuksen, Result-arvoksi?

Kertaus

Result<T> kuvaa onnistumista tai epäonnistumista. Luo se runCatching-funktiolla, muunna sitä map- tai mapCatching-funktiolla, käsittele epäonnistuminen recover-funktiolla, tarkkaile sitä onSuccess- ja onFailure-funktioilla ja yhdistä haarat fold-funktiolla. Se sopii erinomaisesti yksiselitteisiin virheenkäsittelyketjuihin.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”runCatching ja Result<T>” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “runCatching ja Result<T>”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”runCatching ja Result<T>”?

Käyttäkää runCatching-funktiota poikkeusten käärimiseen Result-tyyppiin ja käsitelkää niitä funktionaalisesti. Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”runCatching ja Result<T>”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. try/catch/finally lausekkeena
  2. Mukautettujen poikkeusluokkien luominen
  3. runCatching ja Result
  4. Poikkeusten uudelleenheittäminen ja ketjuttaminen
← Takaisin: Kotlin Academy