DEV Community

GoyesDev
GoyesDev

Posted on

SC #9: Manejo de errores en Task

Task<Success, Failure> es una estructura genérica que espera recibir el tipo de dato que devuelve y el tipo de error que arroja. No es necesario especificar estos valores cuando se implementa un Task, puesto que son inferidos automáticamente.

let tarea1: Task<Int, Swift.Error> = Task { () -> Int in
  throw URLError(.badURL)
}
let tarea2: Task<Int, Never> = Task { () -> Int in
  0
}
Enter fullscreen mode Exit fullscreen mode

Manejando errores dentro de un Task

Se puede manejar un error internamente, usando un do/catch.

let tarea: Task<String, Never> = Task { () -> String in
  do {
    throw URLError(.badURL)
  } catch {
    return "Hubo un error"
  }
}
Enter fullscreen mode Exit fullscreen mode

Esperar una tarea y atrapar potenciales errores

Si se quiere esperar a una tarea y atrapar un posible error, se puede usar la propiedad var value: Success { get async throws }.

En el siguiente ejemplo se espera por el resultado de la tarea tarea y se atrapa cualquier error en el bloque catch.

let tarea: Task<String, Error> = Task { () -> String in
  throw URLError(.badURL)
}
do {
  let result = try await self.tarea.value
} catch {
  print("Hubo un error: \(error)")
}
Enter fullscreen mode Exit fullscreen mode

Errores tipados y Tasks

Actualmente las tareas no tienen errores tipados. Es decir, el siguiente código producirá un error:

let throwingTask: Task<String, URLError> = Task { () -> String in
  throw URLError(.badURL)
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)