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.
Desafío
FácilDefine un enum NumError: Error con dos casos: negative y tooBig.
Define una función que lanza errores doubleSafely(_ n: Int) throws -> Int que:
- Lance
.negativecuandon < 0 - Lance
.tooBigcuandon > 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 { ... } ...
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
1Strings a fondo
Conteo e índicesMayúsculas, minúsculas y TrimBúsqueda en StringsDividir y unirReemplazo de subcadenasResumen: Validación de usuario4Conjuntos
Crear conjuntosUnión e intersecciónResta y diferencia simétricaSubconjunto y superconjuntoResumen - Filtro de etiquetas7Proyecto - Seguimiento de hábitos
Descripción general del proyectoMarcar como completado10Proyecto - Motor de cuestionarios
Descripción general del proyectoHacer preguntas2Rangos e Intervalos
Cerrados vs. SemiabiertosSaltos (Stride)Métodos de RangosRangos en SwitchResumen - Cuadrícula de calendario5Funciones de orden superior Pt. 1
MapFilterReduceEncadenar map, filter, reduceResumen - Estadísticas de palabras3Diccionarios
Declaración de diccionariosBúsqueda opcionalActualización de diccionariosIteración de diccionariosAgrupación de valoresResumen - Inventario6Funciones de orden superior - Parte 2
compactMapflatMapsorted(by:)Construcción de pipelinesRepaso - Tabla de posiciones9Manejo de errores
throws y Errordo, try, catchtry? y try!Propagación de erroresRepaso - Calculadora segura