Manejo de errores en Android

Kotlin no admite excepciones verificadas. Esto simplifica y agiliza el manejo de errores, ya que puedes elegir controlar solo las excepciones que se pueden recuperar. Y, como no tienes que controlar de forma explícita cada excepción posible, tu código está menos desordenado y, por lo tanto, se enfoca más en su propósito principal.

Las fallas recuperables son problemas que un desarrollador puede solucionar por su cuenta. Por ejemplo, si un ID que se usa en una llamada no es válido, la API arroja un HomeException con un mensaje invalid data. Luego, el desarrollador de apps puede elegir quitar ese ID de su caché o mostrarle al usuario un mensaje como "No se encontró la estructura".

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

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

Cualquier método de las APIs de Home puede arrojar una HomeException, por lo que te recomendamos que uses un bloque try-catch para detectar HomeException en todas las llamadas.

Cuando controles HomeException, verifica sus campos error.code y error.message para saber qué ocurrió. También puede haber códigos de error secundarios, por lo que debes llamar al método getSubErrorCodes() y verificar el resultado.

Cualquier excepción no controlada hará que tu app falle.

En la siguiente tabla, se proporcionan los significados de los códigos HomeException que puedes encontrar:

Tabla: Códigos de HomeException
Código Significado
ABORTED La operación se anuló. Esto suele ocurrir debido a un problema de simultaneidad, como una falla en la verificación del secuenciador o la anulación de la transacción.
ALREADY_EXISTS Ya existe la entidad que un cliente intentó crear, como un archivo o directorio.
API_NOT_CONNECTED El cliente intentó llamar a un método desde una API que no se pudo conectar. Esto puede suceder cuando el dispositivo está sin conexión o no admite la API a la que el cliente intentó llamar.
CANCELLED La operación se canceló (por lo general, la cancela el emisor).
COMMAND_FAILED No se pudo ejecutar el comando. Consulta los códigos de error secundarios para obtener más detalles.
CURSOR_WINDOW_NOT_SUPPORTED Se llamó a un método que usa un CursorWindow, pero no se habilitó un CursorWindow o no se admite en el contexto actual.
DATA_LOSS Se produjo un daño o una pérdida de datos irrecuperable.
DEADLINE_EXCEEDED 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ó con éxito.
DECOMMISSIONING_INELIGIBLE Se produjo un error en la retirada porque el dispositivo no es apto para retirarse.
FAILED_PRECONDITION 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, podrías recibir este mensaje si se llamó al comando stop del OvenCavityOperationalStateTrait en un horno que ya se detuvo.
INTERNAL Errores internos. Esto significa que algunos invariantes que el sistema subyacente espera están dañados. Este código de error está reservado para errores graves.
INVALID_ARGUMENT El cliente proporcionó un argumento que está fuera del rango de valores esperado.
INVALID_DATA_HOLDER El titular de los datos no es válido.
NOT_FOUND No se encontró una entidad solicitada, como un archivo o un directorio. Si se niega una solicitud a una clase completa de usuarios, como el lanzamiento gradual de funciones o una lista de entidades permitidas no documentada, se puede usar NOT_FOUND. Si se niega una solicitud a algunos usuarios de una clase, como el control de acceso basado en usuarios, se debe usar PERMISSION_DENIED.
OUT_OF_RANGE Se intentó realizar la operación fuera del rango válido, como buscar o leer más allá de end-of-file. A diferencia de INVALID_ARGUMENT, este error indica un problema que se puede solucionar si cambia el estado del sistema.
PERMISSION_DENIED El emisor no tiene permiso para ejecutar la operación especificada. No se debe usar PERMISSION_DENIED en los rechazos por agotamiento de algún recurso (en su lugar, se debe usar RESOURCE_EXHAUSTED). No se debe usar PERMISSION_DENIED si no se puede identificar al emisor (en su lugar, se debe usar UNAUTHENTICATED). Este código de error no sugiere que la solicitud sea válida ni que la entidad solicitada exista o satisfaga otras condiciones previas.
RESOURCE_EXHAUSTED Se agotó algún recurso, tal vez porque se alcanzó una cuota por usuario o porque se agotó el espacio de todo el sistema de archivos. Por ejemplo, este error se podría producir si se llama al comando dispense de DispenseTrait en un dispositivo de comedero para mascotas, pero no queda más comida en la unidad.

Esto también puede deberse a que se excedió la cuota de un proyecto de las APIs de Home. Para obtener más información, consulta Administración de cuotas.
SDK_INITIALIZATION_MISSING_INFO El SDK se inicializó sin toda la información requerida. Por ejemplo, este error se produce si el cliente intenta obtener un TraitFactory para un ID de atributo determinado, pero el atributo no se incluyó cuando se inicializó el SDK. Consulta Inicializa la casa en Android.
UNAUTHENTICATED No se puede identificar al emisor 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. 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.
WRITE_FAILED No se pudo ejecutar la escritura. Consulta los códigos de error secundarios para obtener más detalles.