Canali degli errori e delle dipendenze
Errori tipizzati e ambiente
Canali degli errori e delle dipendenze è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Scala for Backend Engineering & Functional Programming, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
Due canali potenti
Oltre al valore di successo, ZIO[R, E, A] tiene traccia di un canale dell'errore tipizzato E e di un canale delle dipendenze R. Entrambi sono visibili nel tipo, rendendo espliciti a compile time gli errori e i requisiti.
Errori tipizzati
Modelli gli errori del dominio come una gerarchia sealed e la inserisca in E. Il compilatore la obbligherà quindi a gestire esattamente quei casi.
import zio._
sealed trait AppError
case object NotFound extends AppError
case object Forbidden extends AppError
val lookup: IO[AppError, String] = ZIO.fail(NotFound)Recupero con catchAll
catchAll gestisce ogni errore in E fornendo un nuovo effetto. Dopo questa operazione, il canale degli errori può diventare Nothing se tutti gli errori sono stati gestiti.
import zio._
val safe: UIO[String] =
ZIO.fail("boom").catchAll(e => ZIO.succeed(s"recovered: $e"))catchSome e orElse
catchSome gestisce solo gli errori corrispondenti. orElse usa un altro effetto come fallback in caso di qualsiasi errore.
import zio._
val prog = ZIO.fail("x").orElse(ZIO.succeed("fallback"))Either e fold
either trasforma ZIO[R, E, A] in ZIO[R, Nothing, Either[E, A]]. fold gestisce errore e successo producendo un unico valore.
import zio._
val label: UIO[String] =
ZIO.fail(404).fold(e => s"err $e", v => s"ok $v")Defect e failure
ZIO distingue le failure (tipizzate, previste, in E) dai defect (Throwable imprevisti). ZIO.die solleva un defect; i defect non appartengono al tipo E e rappresentano bug.
L'ambiente R
Il canale R dichiara i servizi necessari a un effetto. È possibile accedere a un servizio con ZIO.service; il requisito rimane in R finché non viene fornito.
import zio._
trait Logger { def log(s: String): UIO[Unit] }
val prog: ZIO[Logger, Nothing, Unit] =
ZIO.serviceWithZIO[Logger](_.log("hello"))Definizione di un servizio
Un servizio è un trait insieme a un ZLayer che lo costruisce. I layer descrivono come costruire le dipendenze e possono a loro volta dipendere da altre dipendenze.
import zio._
case class ConsoleLogger() extends Logger {
def log(s: String): UIO[Unit] = ZIO.succeed(println(s))
}
object ConsoleLogger {
val layer: ULayer[Logger] = ZLayer.succeed(ConsoleLogger())
}
trait Logger { def log(s: String): UIO[Unit] }Fornitura delle dipendenze
provide (o provideLayer) soddisfa il requisito R, trasformando ZIO[Logger, E, A] in ZIO[Any, E, A], pronto per essere eseguito.
import zio._
val runnable: UIO[Unit] =
ZIO.serviceWithZIO[Logger](_.log("hi"))
.provide(ConsoleLogger.layer)
trait Logger { def log(s: String): UIO[Unit] }
object ConsoleLogger { val layer: ULayer[Logger] = ??? }Composizione dei layer
I layer si compongono orizzontalmente con ++ (combinazione) e verticalmente con >>> (inoltro dell'output di un layer come input di un altro), costruendo un grafo completo delle dipendenze.
import zio._
// val appLayer = configLayer ++ (dbLayer >>> repoLayer)Esempio di riferimento in Scala semplice
Per fare un confronto, ecco un programma Scala autonomo con gestione manuale degli errori. ZIO codifica lo stesso errore nel tipo e inserisce le dipendenze tramite i layer.
object Main {
def main(args: Array[String]): Unit = {
val result: Either[String, Int] = Left("NotFound")
val msg = result.fold(e => s"err $e", v => s"ok $v")
println(msg)
}
}Verifica rapida
Che cosa fa il metodo provide su un ZIO[Logger, E, A]?
Riepilogo
Ha lavorato con entrambi i canali aggiuntivi:
- Errori:
Etipizzato,catchAll,orElse,fold, defect e failure - Dipendenze:
R, servizi,ZLayer,provide, composizione dei layer
Prossimo argomento: l'esecuzione delle applicazioni ZIO.
Impara Scala con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 39
- Lezioni
- 143
Domande Frequenti
La lezione «Canali degli errori e delle dipendenze» è gratuita?
Sì — il testo completo di «Canali degli errori e delle dipendenze» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Scala for Backend Engineering & Functional Programming, passa a CoddyKit PRO. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
Cosa imparerò in «Canali degli errori e delle dipendenze»?
Errori tipizzati e ambiente Eserciti Scala for Backend Engineering & Functional Programming con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Scala for Backend Engineering & Functional Programming?
Non è richiesta alcuna esperienza precedente. Scala for Backend Engineering & Functional Programming su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Canali degli errori e delle dipendenze»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Scala for Backend Engineering & Functional Programming?
Sì. Ogni lezione Scala for Backend Engineering & Functional Programming include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- L'effetto ZIO
- Comporre ZIO
- Canali degli errori e delle dipendenze
- Eseguire app ZIO