Kotlin no admite excepciones verificadas. Esto simplifica y optimiza el control de errores, ya que puedes optar por controlar solo las excepciones que son potencialmente recuperables. Además, como no tienes que controlar de forma explícita cada excepción posible, tu código es menos desordenado y, por lo tanto, se mantiene más enfocado en su propósito principal.
Los errores recuperables son problemas que un desarrollador puede solucionar desde su extremo.
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 la app puede optar por quitar ese ID de su caché o mostrarle al usuario un mensaje como "No se encontró la estructura".
A continuación, se muestra un ejemplo de cómo se podría 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 un 
    HomeException, por lo que te recomendamos que uses un bloque try-catch para
  detectar HomeException en todas las llamadas.
Cuando manejes HomeException, verifica sus campos 
    error.code y 
    error.message para saber qué salió mal. También puede haber códigos de suberror, por lo que debes llamar al método 
    getSubErrorCodes() y verificar el resultado.
Si no se controlan las excepciones, la app fallará.
En la siguiente tabla, se proporcionan los significados de los códigos de HomeException que puedes encontrar:
| Código | Significado | 
|---|---|
| ABORTED | La operación se anuló, por lo general, 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, por ejemplo, un archivo o directorio. | 
| API_NOT_CONNECTED | El cliente intentó llamar a un método de una API que no se pudo conectar. Esto puede suceder cuando el dispositivo está sin conexión o no admite la API 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ó o no se admite unCursorWindowen el contexto actual. | 
| DATA_LOSS | Se produjo una pérdida o corrupción 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ó correctamente. | 
| DECOMMISSIONING_INELIGIBLE | La baja falló porque el dispositivo no es apto para la baja. | 
| FAILED_PRECONDITION | La operación se rechazó porque 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 se llamó al comando stopdelOvenCavityOperationalStateTraiten un horno que ya se detuvo. | 
| 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. | 
| INVALID_ARGUMENT | El cliente proporcionó un argumento que está fuera del rango esperado de valores. | 
| INVALID_DATA_HOLDER | El titular de los datos no es válido. | 
| NOT_FOUND | No se encontró alguna entidad solicitada, como un archivo o un directorio.
        Si se rechaza una solicitud para 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 rechaza una solicitud para algunos usuarios dentro de una clase de usuarios, como el control de acceso basado en usuarios, se debe usarPERMISSION_DENIED. | 
| OUT_OF_RANGE | La operación se intentó más allá del rango válido, como buscar o leer más allá de end-of-file. A diferencia deINVALID_ARGUMENT, este error indica un problema que se puede solucionar si el estado del sistema cambia. | 
| PERMISSION_DENIED | El llamador no tiene permiso para ejecutar la operación especificada. No se debe usar PERMISSION_DENIEDen los rechazos por agotamiento de algún recurso (en su lugar, se debe usarRESOURCE_EXHAUSTED).
        No se debe usarPERMISSION_DENIEDsi no se puede identificar al emisor (en su lugar, usaUNAUTHENTICATEDpara esos errores).
        Este código de error no implica que la solicitud sea válida o que la entidad solicitada exista o satisfaga otras condiciones previas. | 
| RESOURCE_EXHAUSTED | Se agotó algún recurso, tal vez debido a que se alcanzó una cuota por usuario o a que se agotó el espacio de todo el sistema de archivos.
        Por ejemplo, este error se podría generar si se llama al comando dispensedelDispenseTraiten un dispositivo alimentador de mascotas, pero no queda comida en la unidad. | 
| SDK_INITIALIZATION_MISSING_INFO | El SDK se inicializó sin toda la información requerida.
        Por ejemplo, este error se genera si el cliente intenta obtener un TraitFactorypara un ID de rasgo determinado, pero el rasgo no se incluyó cuando se inicializó el SDK. Consulta Cómo inicializar la página principal en Android. | 
| 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. UNKNOWNaparece 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. |