Gestión de errores en IO
handleError
Gestión de errores en IO es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Scala for Backend Engineering & Functional Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
Errores como valores
En Cats Effect, un IO puede fallar. El error forma parte del valor, por lo que puede inspeccionarlo y recuperarse de él sin un try/catch desestructurado.
Lanzamiento de errores
Use IO.raiseError para crear explícitamente un IO fallido con la excepción que elija.
import cats.effect.IO
val failed: IO[Int] =
IO.raiseError(new RuntimeException("boom"))handleError
handleError recupera un IO fallido proporcionando un valor alternativo calculado a partir del error. El resultado es un IO que no puede fallar en este punto.
import cats.effect.IO
val safe: IO[Int] =
IO.raiseError[Int](new RuntimeException("x"))
.handleError(_ => -1)handleErrorWith
handleErrorWith se recupera mediante otro IO, por lo que la alternativa también puede tener efectos, como registrar información, reintentar o devolver un valor predeterminado.
import cats.effect.IO
val recovered: IO[Int] =
IO(throw new RuntimeException("fail"))
.handleErrorWith(e => IO.println(s"caught: ${e.getMessage}").as(0))attempt
attempt convierte un IO[A] en IO[Either[Throwable, A]], materializando el error en el valor para que pueda aplicar pattern matching sobre él.
import cats.effect.IO
val e: IO[Either[Throwable, Int]] =
IO.raiseError[Int](new RuntimeException("oops")).attemptPattern matching con attempt
Después de attempt, puede elegir entre éxito y error mediante un flatMap normal sobre el Either.
import cats.effect.IO
val prog: IO[Unit] = IO(10 / 2).attempt.flatMap {
case Right(v) => IO.println(s"ok: $v")
case Left(e) => IO.println(s"err: ${e.getMessage}")
}redeem
redeem gestiona ambas ramas en una sola llamada: una función para el error y otra para el éxito; ambas devuelven un valor simple.
import cats.effect.IO
val label: IO[String] =
IO(42).redeem(e => s"failed: $e", v => s"value: $v")redeemWith
redeemWith es similar a redeem, pero cada rama devuelve un IO, lo que permite gestionar con efectos tanto el éxito como el error.
import cats.effect.IO
val prog: IO[Unit] = IO(42).redeemWith(
e => IO.println(s"err: $e"),
v => IO.println(s"got: $v")
)Limpieza con garantía
guarantee ejecuta un finalizador tanto si el efecto tiene éxito como si falla; es perfecto para liberar recursos o registrar la finalización.
import cats.effect.IO
val prog: IO[Int] =
IO(compute()).guarantee(IO.println("done"))
def compute(): Int = 7Reintento tras un error
Puede crear un reintento sencillo recuperándose recursivamente con handleErrorWith y reduciendo un contador hasta que llegue a cero.
import cats.effect.IO
def retry[A](io: IO[A], n: Int): IO[A] =
if (n <= 0) io
else io.handleErrorWith(_ => retry(io, n - 1))try/catch en Scala convencional
Compárelo con la gestión de errores eager clásica de Scala convencional. Los combinadores de IO proporcionan la misma seguridad, pero como valores puros y componibles.
object Main {
def main(args: Array[String]): Unit = {
val result = try { 10 / 0 } catch { case _: ArithmeticException => -1 }
println(s"result: $result")
}
}Comprobación rápida
¿Qué método convierte un IO[A] en IO[Either[Throwable, A]]?
Resumen
Ha gestionado errores en IO con:
raiseErrorpara fallar explícitamentehandleError/handleErrorWithpara recuperarseattemptpara materializarEitherredeem/redeemWithpara ambas ramasguaranteepara la limpieza
Ha completado el curso de Cats e IO.
Aprende Scala con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 39
- Lecciones
- 143
Preguntas frecuentes
¿La lección «Gestión de errores en IO» es gratis?
Sí — el texto completo de «Gestión de errores en IO» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Scala for Backend Engineering & Functional Programming, actualiza a CoddyKit PRO. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
¿Qué aprenderé en «Gestión de errores en IO»?
handleError Practicas Scala for Backend Engineering & Functional Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Scala for Backend Engineering & Functional Programming?
No se requiere experiencia previa. Scala for Backend Engineering & Functional Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Gestión de errores en IO»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Scala for Backend Engineering & Functional Programming?
Sí. Cada lección de Scala for Backend Engineering & Functional Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Type Classes de Cats
- La mónada IO
- Composición de IO
- Gestión de errores en IO