Menu
Coddy logo textTech

throws y Error

Parte de la sección Lógica y Flujo del Journey de Swift de Coddy — lección 44 de 56.

Swift maneja los errores haciendo que las funciones declaren que pueden fallar. El cuerpo de la función lanza un valor de error; el llamador debe manejarlo.

Un tipo de error es cualquier cosa que cumpla con el protocolo incorporado Error. La forma más sencilla de declarar el tuyo propio es con un enum:

enum InputError: Error {
    case empty
    case tooLong
}

Una función que lanza errores utiliza la palabra clave throws en su firma y la sentencia throw en su cuerpo:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

No puedes llamar directamente a una función que lanza errores, el compilador te obliga a manejar el error. La siguiente lección explica cómo.

challenge icon

Desafío

Fácil

Define un enum NumError: Error con dos casos: negative y tooBig.

Define una función que lanza errores doubleSafely(_ n: Int) throws -> Int que:

  • Lance .negative cuando n < 0
  • Lance .tooBig cuando n > 100
  • De lo contrario, devuelva n * 2

Lee un único entero desde stdin. Llama a doubleSafely dentro de un bloque do/catch (aprenderás la forma exacta en la próxima lección; por ahora usa este esqueleto exacto):

do {
    let result = try doubleSafely(n)
    print("ok: \(result)")
} catch NumError.negative {
    print("negative")
} catch NumError.tooBig {
    print("too big")
} catch {
    print("unknown")
}

Para la entrada 10 la salida es ok: 20. Para -1 es negative. Para 500 es too big.

Hoja de referencia

Define tipos de error usando un enum que cumpla con Error:

enum InputError: Error {
    case empty
    case tooLong
}

Marca una función como lanzadora de errores con throws y usa throw para lanzar un error:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

Las funciones que lanzan errores deben llamarse con manejo de errores (por ejemplo, do/catch); el compilador impone esto.

Pruébalo tú mismo

let n = Int(readLine()!)!

// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo