Manejo de errores con do, try y catch

Resumen

Manejar errores en Swift se vuelve sencillo cuando entiendes cómo funcionan do, try y catch. Estas tres palabras clave te permiten capturar fallos inesperados, controlar el flujo de tu app y darle una mejor experiencia al usuario cuando algo no sale como esperabas.

¿Qué hace la palabra try en Swift?

Cuando una función lanza errores con throws, Swift te obliga a usar try al llamarla. Lo que hace try es decirle al compilador: voy a intentar ejecutar esta línea. Si todo sale bien, el código continúa. Si algo falla y nadie maneja el error, la ejecución se detiene de golpe [02:10].

¿Para qué sirve try en Swift? Es la palabra clave que marca el llamado a una función que puede lanzar errores. Sin try, el compilador no te deja invocar funciones marcadas con throws.

¿Cuáles son las tres formas de usar try?

Swift te ofrece tres variantes y cada una se comporta distinto frente a un error:

  • try a secas: si la función lanza un error y no hay un catch que lo capture, el playground o la app termina con el mensaje de que se lanzó un error no capturado.
  • try! con signo de admiración (force try): si ocurre un error, provoca un crash inmediato. Xcode marca la línea como interrumpida sin darte muchos detalles.
  • try? con signo de interrogación (optional try): si la función falla, el resultado se convierte en nil y el programa sigue corriendo como si nada.

El try? puede parecer la salida fácil, pero usarlo en funciones core de tu sistema es peligroso. Vas a ocultar errores que más adelante se convierten en bugs raros o crashes en partes del código que parecían sanas.

¿Cómo capturar errores con do catch?

Aquí entra la combinación que de verdad te da control. Abres un bloque do con tus llamados a funciones que usan try, y agregas un bloque catch justo después. Si alguna línea dentro del do lanza un error, la ejecución salta inmediatamente al catch y ahí decides qué hacer [05:30].

Un ejemplo mínimo se ve así:

swift do { try insertarEstudiante(estudiante) } catch { print(error.localizedDescription) }

La propiedad localizedDescription viene del protocolo Error y de LocalizedError. Por eso, cuando defines tu propio enum de errores como ManagerError implementando esos protocolos, puedes mostrar mensajes claros y personalizados al usuario.

¿Cuándo se ejecuta el bloque catch? Solo cuando alguna instrucción dentro del do lanza un error. Si todo se ejecuta sin fallos, el catch se ignora por completo.

¿Qué pasa si tengo varios try dentro del mismo do?

Un solo bloque do puede contener varios try seguidos. Pero hay un detalle importante: en cuanto uno de ellos lanza un error, el resto de las líneas dentro de ese do no se ejecutan. El control salta directo al catch.

Esto te deja dos caminos como desarrollador:

  1. Agrupar todos los try en un mismo do catch cuando quieres que un error detenga toda la secuencia.
  2. Crear un do catch independiente para cada función cuando necesitas que cada llamado se maneje por separado y los demás sigan corriendo.

La decisión depende de la lógica de tu app. Por ejemplo, si insertar un estudiante falla pero igual quieres asignar materias y generar el reporte, conviene separar los bloques.

¿Por qué importa manejar bien los errores y no solo silenciarlos?

Capturar errores no es un capricho del lenguaje. Es lo que te permite mostrarle al usuario un mensaje útil del estilo ha ocurrido un error, inténtalo más tarde en lugar de un crash silencioso. Tu app se siente más profesional y tu código se vuelve más mantenible.

Algunas buenas prácticas que conviene cargar siempre contigo:

  • Mantén tu Xcode en la última versión estable, evita betas y versiones viejas para estar al nivel de la industria.
  • Verifica la versión de Swift que usas y compárala con los cambios recientes del lenguaje.
  • Documenta tu código con comentarios claros para que tu yo del futuro o cualquier otro desarrollador entienda qué hiciste.
  • Usa nomenclatura consistente al definir variables, funciones y clases.

Con esto ya tienes el panorama completo para trabajar opcionales y errores de forma segura en Swift. ¿Tú sueles usar try? con frecuencia o prefieres siempre el do catch? Cuéntame cómo lo manejas en tus proyectos.