Scala for Backend Engineering & Functional Programming · Lezione

Canali degli errori e delle dipendenze

Errori tipizzati e ambiente

Lezione 3 di 413 passaggi

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: E tipizzato, catchAll, orElse, fold, defect e failure
  • Dipendenze: R, servizi, ZLayer, provide, composizione dei layer

Prossimo argomento: l'esecuzione delle applicazioni ZIO.

Gratis per iniziare

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

  1. L'effetto ZIO
  2. Comporre ZIO
  3. Canali degli errori e delle dipendenze
  4. Eseguire app ZIO
← Torna a Scala for Backend Engineering & Functional Programming