Manejo de errores en iOS

Swift proporciona compatibilidad integrada para lanzar y capturar errores recuperables en el tiempo de ejecución. Por ejemplo, si una operación en tu código falla o no es válida, la API muestra un error HomeError. Esto simplifica y optimiza el manejo de errores, ya que te permite enfocarte solo en los errores recuperables. Luego, puedes proporcionar opciones, como permitir que el usuario vuelva a intentarlo o mostrar un mensaje como "No se encontró la estructura". Y como no tienes que controlar de forma explícita cada posible excepción, tu código está menos desordenado y, en consecuencia, se mantiene más enfocado en su propósito principal.

Este es un ejemplo de cómo se puede controlar una falla recuperable:

    let light1 = lightDevices.first
    if let light = light1 {
    do {
      try await structure.move(device: light, to: room)
    } catch let error as HomeError {
      // Code for handling the exception
    }

En la siguiente tabla, se proporcionan los significados de los códigos HomeError que podrías encontrar:

Tabla: HomeError códigos
Código Significado
aborted Se anuló la operación. Por lo general, aparece cuando hay un problema de simultaneidad, como una falla en la verificación de secuencia o la anulación de la transacción.
alreadyExists El recurso o la entidad que intentas crear ya existe. Por ejemplo, puede ser un programa con nombre para un termostato.
cancelled La operación se canceló (por lo general, la cancela el emisor).
dataLoss Daño o pérdida de datos no recuperable.
deadlineExceeded El plazo venció antes de que la operación se pudiera completar. En el caso de las operaciones que cambian el estado del sistema, es probable que se muestre este error incluso si la operación se completó correctamente. Por ejemplo, una respuesta correcta desde un servidor podría haberse retrasado lo suficiente como para que el plazo venciera.
failedPrecondition La operación se rechazó debido a que el sistema no se encuentra en un estado necesario para la ejecución de la operación. Por ejemplo, es posible que recibas este mensaje si llamaste a stop en un horno que ya está detenido.
internal Errores internos. Esto significa que algunos invariantes que espera el sistema subyacente están rotos. Este código de error está reservado para errores graves.
invalidArgument El cliente especificó un argumento no válido. Ten en cuenta que esto difiere de "failedPrecondition". "invalidArgument" indica argumentos que son problemáticos sin importar el estado del sistema (por ejemplo, un nombre de archivo con formato incorrecto).
notFound Especificaste una entidad o un recurso que no se puede encontrar. Por ejemplo, especificar un ID de pista inexistente cuando se llama a play en un dispositivo de reproductor multimedia
outOfRange Un parámetro superó el rango válido según el estado actual del sistema. Este mensaje se produce cuando el valor está dentro del rango de valores que la llamada a la API podría aceptar, pero no tiene sentido en el contexto actual.
permissionDenied No tienes permiso para ejecutar la operación especificada. Este código de error no debe interpretarse como que la solicitud es válida de otra manera.
resourceExhausted Se agotó algún recurso. Por ejemplo, esto podría ocurrir cuando se llama a dispense(item:amount:unit:presetName:) en un dispositivo de alimentación para mascotas y no queda comida en la unidad.
unauthenticated No se puede identificar al llamador o la solicitud no tiene credenciales de autenticación válidas.
unavailable El servicio no está disponible. Lo más probable es que esta sea una condición transitoria y que se pueda corregir si vuelves a intentar una retirada. Ten en cuenta que no siempre es seguro reintentar operaciones no idempotentes.
unimplemented La operación solicitada no se implementó, no se admite o no está habilitada en este servicio.
unknown Error desconocido. En términos generales, unknown aparece cuando se produce una condición de error que no se puede clasificar con ninguno de los otros códigos de error. Por ejemplo, este error puede mostrarse cuando un valor de estado recibido de una API externa no tiene suficiente información sobre la causa raíz.