Scala for Backend Engineering & Functional Programming · Lección

Gestión de errores en IO

handleError

Lección 4 de 413 pasos

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")).attempt

Pattern 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 = 7

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

  • raiseError para fallar explícitamente
  • handleError / handleErrorWith para recuperarse
  • attempt para materializar Either
  • redeem / redeemWith para ambas ramas
  • guarantee para la limpieza

Ha completado el curso de Cats e IO.

Gratis para empezar

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

  1. Type Classes de Cats
  2. La mónada IO
  3. Composición de IO
  4. Gestión de errores en IO
← Volver a Scala for Backend Engineering & Functional Programming