Kotlin Academy · Lektion

Either<L, R>: typsäker felhantering utan exception

Använd Either för att representera lyckade och misslyckade resultat utan att kasta undantag.

Lektion 1 av 413 steg

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.right

Returnera 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:

  • Either gör felhanteringsvägen tydlig i funktionssignaturen
  • Right = framgång; Left = fel (enligt konvention)
  • map { } — omvandla lyckade värden; flatMap { } — kedja beräkningar som kan misslyckas
  • fold(ifLeft, ifRight) — hantera båda fallen i ett enda uttryck
  • Either.catch { } — kapsla in kod som kastar undantag vid gränserna
Gratis att börja

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

  1. Either : typsäker felhantering utan exception
  2. Arrow Raise DSL: Komponera typade fel
  3. Option och nullable: När ska de användas?
  4. Funktionell domänmodellering med Arrows kärntyper
← Tillbaka till Kotlin Academy