Either<L, R>: typsäker felhantering utan exception
Använd Either för att representera lyckade och misslyckade resultat utan att kasta undantag.
Either<L, R>: typsäker felhantering utan exception är en gratis lektion i Kotlin Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Kotlin Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Kotlin Academy innehåller totalt 4 lektioner.
Problemet med undantag för affärslogik
Undantag är avsedda för oväntade fel (nullpekare, IO-fel). Om ni använder dem för att signalera förväntade affärsrelaterade fel (valideringsfel, ”hittades inte”) blir kontrollflödet osynligt, ni måste använda try/catch vid varje anropsställe och felen döljs i funktionssignaturerna.
Vad är Either<L, R>?
Either är en summa-typ med två fall: Left(value: L) innehåller enligt konvention felet och Right(value: R) innehåller enligt konvention det lyckade resultatet. En funktion som returnerar Either gör möjligheten till ett fel tydlig i sin signatur.
Arrow's Either
Lägg till Arrow i projektet för att få Either och hela dess ekosystem av operatorer:
// build.gradle.kts
implementation("io.arrow-kt:arrow-core:1.2.4")
// Usage
import arrow.core.Either
import arrow.core.left
import arrow.core.rightReturnera Either från en funktion
Returnera value.right() vid framgång och error.left() vid fel. Den som anropar funktionen måste hantera båda grenarna:
sealed class UserError { object NotFound : UserError(); data class InvalidEmail(val msg: String) : UserError() }
fun findUser(id: Long): Either<UserError, User> =
if (id <= 0) UserError.NotFound.left()
else User(id, "Alice").right()Hantera Either med fold
Använd fold(ifLeft, ifRight) för att hantera båda fallen i ett enda uttryck:
val result = findUser(1L)
val message = result.fold(
ifLeft = { error -> "Error: $error" },
ifRight = { user -> "Found: ${user.name}" }
)
println(message)Omvandla Right-värdet med map
map { } omvandlar Right-värdet utan att påverka en Left. Därför är Either en funktor — ni kan kedja omvandlingar på ett säkert sätt:
val nameResult: Either<UserError, String> = findUser(1L).map { it.name }Kedja med flatMap
flatMap { } kedjar beräkningar som själva returnerar Either. Om något steg returnerar Left avbryts kedjan direkt och felet förs vidare utan att efterföljande steg körs:
fun validateEmail(email: String): Either<UserError, String> =
if (email.contains("@")) email.right()
else UserError.InvalidEmail("bad format").left()
fun createUser(email: String): Either<UserError, User> =
validateEmail(email).flatMap { validEmail ->
User(1L, validEmail).right()
}Either.catch för att kapsla in undantag
Either.catch { } kör ett kodblock och kapslar in alla undantag som en Left. Använd det vid gränsen mellan äldre kod som kastar undantag och er Either-baserade domän:
val result: Either<Throwable, User> = Either.catch {
userRepository.findOrThrow(id)
}Återställning med getOrElse och orElse
getOrElse { default } hämtar Right-värdet eller returnerar ett standardvärde. orElse { alternativeEither } ersätter en Left med en annan beräkning:
val user: User = findUser(0L).getOrElse { User(-1L, "Guest") }
val user2: Either<UserError, User> = findUser(0L).orElse { User(99L, "Default").right() }Mönstermatchning med when
Använd when med en sealed Either-liknande klass eller direkt med Either och is Either.Left / Either.Right för att hantera alla fall:
when (val r = findUser(1L)) {
is Either.Left -> println("Error: ${r.value}")
is Either.Right -> println("User: ${r.value.name}")
}Either i servicelager
Returnera Either från repository- och servicefunktioner. Mappa det till HTTP-svar på Ktor-ruttnivå och håll affärslogiken fri från ramverksberoenden:
get("/users/{id}") {
val id = call.parameters["id"]?.toLongOrNull() ?: return@get call.respond(HttpStatusCode.BadRequest)
userService.findById(id).fold(
ifLeft = { call.respond(HttpStatusCode.NotFound) },
ifRight = { call.respond(it) }
)
}Snabb kontroll
Vad gör flatMap { } med ett värde av typen Either.Left?
Sammanfattning: Either<L, R>
Viktigaste lärdomarna:
Eithergör felhanteringsvägen tydlig i funktionssignaturenRight= framgång;Left= fel (enligt konvention)map { }— omvandla lyckade värden;flatMap { }— kedja beräkningar som kan misslyckasfold(ifLeft, ifRight)— hantera båda fallen i ett enda uttryckEither.catch { }— kapsla in kod som kastar undantag vid gränserna
Lär dig Kotlin med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Either<L, R>: typsäker felhantering utan exception” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Kotlin Academy, inklusive ”Either<L, R>: typsäker felhantering utan exception”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Kotlin Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Either<L, R>: typsäker felhantering utan exception”?
Använd Either för att representera lyckade och misslyckade resultat utan att kasta undantag. Ni övar på Kotlin Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Kotlin Academy?
Du behöver inga förkunskaper. Utbildningen i Kotlin Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Either<L, R>: typsäker felhantering utan exception”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Kotlin Academy-lektionen?
Ja. Varje Kotlin Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Either : typsäker felhantering utan exception
- Arrow Raise DSL: Komponera typade fel
- Option och nullable: När ska de användas?
- Funktionell domänmodellering med Arrows kärntyper