Arrow Raise DSL: tyypitettyjen virheiden yhdistäminen
Käyttäkää Arrowin Raise-kontekstia ja raise()-funktiota useita virheitä sisältävien työnkulkujen siistiin yhdistämiseen.
Arrow Raise DSL: tyypitettyjen virheiden yhdistäminen on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/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.
Either-ketjutuksen rajoitus
Either-arvojen ketjuttaminen flatMap-funktiolla tuottaa syvästi sisäkkäisiä lambdoja, kun peräkkäisiä operaatioita on useita. Arrow'n Raise DSL (esitelty Arrow 1.2:ssa) tarjoaa selkeämmän coroutine-tyylisen syntaksin Kotlinin context receiverien tai extension-funktioiden avulla.
Mikä on Raise<E>?
Raise on konteksti, joka voi nostaa (eli keskeyttää suorituksen) tyypin E virheen. Epäonnistuva funktio kutsuu raise(error)-funktiota keskeyttääkseen suorituksen ja välittääkseen virheen eteenpäin. Toiminta muistuttaa poikkeuksen heittämistä, mutta ilman poikkeuksia.
either { } -rakentaja
either { } -rakentaja luo Either -arvon lohkosta, jonka kontekstissa on käytettävissä Raise. Lohkon sisällä kutsukaa epäonnistumisen tapauksessa raise(error)-funktiota tai palauttakaa onnistumisen tapauksessa arvo suoraan:
import arrow.core.raise.either
import arrow.core.raise.Raise
fun validateAge(age: Int): Either<String, Int> = either {
if (age < 0) raise("Age cannot be negative")
if (age > 150) raise("Age too large")
age
}bind() — Either-arvon purkaminen either{}-lohkon sisällä
Kutsukaa either { } -lohkon sisällä .bind()-funktiota mille tahansa Either-arvolle sen purkamiseksi. Jos arvo on Left, bind() nostaa virheen ja keskeyttää lohkon automaattisesti:
fun createUser(name: String, age: Int): Either<String, User> = either {
val validName = validateName(name).bind() // raises if Left
val validAge = validateAge(age).bind() // raises if Left
User(validName, validAge) // only reached if both succeed
}ensure() — ehtotarkistus suoraan koodissa
ensure(condition) { error } on lyhyt muoto ilmaisulle if (!condition) raise(error). Se pitää validointilogiikan tiiviinä:
fun validateEmail(email: String): Either<String, String> = either {
ensure(email.contains("@")) { "Email must contain @" }
ensure(email.length <= 255) { "Email too long" }
email
}ensureNotNull() — null-tarkistus Raise-funktion avulla
ensureNotNull(value) { error } purkaa nullable-arvon tai nostaa virheen, jos arvo on null:
fun findUser(id: Long, repo: UserRepo): Either<UserError, User> = either {
ensureNotNull(repo.findById(id)) { UserError.NotFound(id) }
}Raise kontekstireceivereilla (Arrow 1.2+)
Voitte määritellä funktioita, jotka vaativat suoraan Raise-kontekstin ilman käärimistä either { } -lohkoon:
context(Raise<String>)
fun requirePositive(n: Int): Int {
ensure(n > 0) { "Must be positive" }
return n
}
// Called inside either { }
val result = either { requirePositive(-1) } // Left("Must be positive")Virheiden kerääminen zipOrAccumulate-funktiolla
Oletusarvoisesti Raise keskeyttää suorituksen ensimmäisen virheen kohdalla. Käyttäkää zipOrAccumulate()-funktiota useiden validointien suorittamiseen ja kaikkien virheiden keräämiseen NonEmptyList-listaan:
val result: Either<NonEmptyList<String>, User> = either {
zipOrAccumulate(
{ validateName(name).bind() },
{ validateAge(age).bind() }
) { validName, validAge -> User(validName, validAge) }
}recover { } — tiettyjen virheiden käsittely
Käyttäkää either { } -lohkon sisällä recover { error -> ... } -rakennetta tietyn nostetun virheen käsittelyyn ja varaarvon antamiseen, jolloin laskenta voi jatkua:
val name: String = either {
findUser(0L).bind().name
}.recover { error ->
if (error == UserError.NotFound) "Guest" else raise(error)
}.getOrNull() ?: "Guest"Raise ja Either-ketjutus: milloin kumpaakin käytetään
Käyttäkää either { }.bind() -rakennetta lineaarisiin kulkuihin, joissa on useita peräkkäisiä vaiheita — koodi näyttää imperatiiviselta mutta säilyy puhtaana. Käyttäkää flatMap-ketjutusta lyhyisiin kahden vaiheen koostamisiin tai kun koostatte toimintoja muiden funktionaalisten kirjastojen kanssa.
Raise-pohjaisten funktioiden testaaminen
Testatkaa funktiota kutsumalla sitä either { } -lohkon sisällä ja tarkistamalla tulos. Arrow'n shouldBeLeft()- ja shouldBeRight()-Kotest-täsmäyttimet tekevät tarkistuksista tiiviitä:
import arrow.core.shouldBeLeft
import arrow.core.shouldBeRight
@Test
fun `negative age returns Left`() {
validateAge(-1).shouldBeLeft()
}
@Test
fun `valid age returns Right`() {
validateAge(25).shouldBeRight(25)
}Pikatarkistus
Mitä either { } -lohkon sisällä tapahtuu, kun Either.Left -arvolle kutsutaan .bind()-funktiota?
Yhteenveto: Arrow Raise DSL
Keskeiset opit:
either { }luoEither-arvon lohkosta, jonka kontekstissa onRaise.bind()purkaaEither-arvon ja keskeyttää suorituksenLeft-arvon kohdallaensure(condition) { error }jaensureNotNull(value) { error }inline-tarkistuksiinzipOrAccumulate()kerää useita virheitä sen sijaan, että suoritus keskeytyisi ensimmäiseen- Koodi näyttää imperatiiviselta mutta säilyy puhtaasti funktionaalisena
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 ”Arrow Raise DSL: tyypitettyjen virheiden yhdistäminen” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Arrow Raise DSL: tyypitettyjen virheiden yhdistäminen”. 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 ”Arrow Raise DSL: tyypitettyjen virheiden yhdistäminen”?
Käyttäkää Arrowin Raise-kontekstia ja raise()-funktiota useita virheitä sisältävien työnkulkujen siistiin yhdistämiseen. 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 2/4.
Kuinka kauan ”Arrow Raise DSL: tyypitettyjen virheiden yhdistäminen”-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
- Either : tyypitetty virheenkäsittely ilman poikkeuksia
- Arrow Raise DSL: tyypitettyjen virheiden yhdistäminen
- Option ja nullable: milloin kumpaakin käytetään
- Toiminnallinen domain-mallinnus Arrowin ydintyypeillä