runCatching ja Result<T>
Käyttäkää runCatching-funktiota poikkeusten käärimiseen Result-tyyppiin ja käsitelkää niitä funktionaalisesti.
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.
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
- try/catch/finally lausekkeena
- Mukautettujen poikkeusluokkien luominen
- runCatching ja Result
- Poikkeusten uudelleenheittäminen ja ketjuttaminen