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.
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 seguraPractica por tu cuenta: Playground de Swift