Kotlin no admite excepciones verificadas. Esto simplifica y optimiza el manejo de errores, ya que puedes elegir controlar solo aquellas excepciones que son potencialmente recuperables. Además, como no tienes que controlar explícitamente todas las excepciones posibles, tu código está menos desordenado y, por lo tanto, se mantiene más enfocado en su propósito principal.
Las fallas recuperables son problemas que un desarrollador puede abordar desde su extremo.
Por ejemplo, si un ID que se usa en una llamada no es válido, la API arroja una HomeException con un mensaje invalid data. Luego, el desarrollador de apps puede optar por 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 podría manejar 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 manejes HomeException, verifica sus campos
error.code y
error.message para saber qué salió mal. También puede haber códigos de suberror
as well, so call the
getSubErrorCodes() method and check the result.
Cualquier excepción no controlada provocará que falle tu app.
En la siguiente tabla, se proporcionan los significados de los códigos HomeException que puedes encontrar:
| 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, por ejemplo, un archivo o un 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 suberror para obtener más detalles. |
CURSOR_WINDOW_NOT_SUPPORTED |
Se llamó a un método que usa un
CursorWindow, pero
un CursorWindow no está habilitado o no se admite en
el contexto actual. |
DATA_LOSS |
Se produjo una pérdida de datos o daño 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ó 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 se llamó al comando stop de
OvenCavityOperationalStateTrait en 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 de valores esperado. |
INVALID_DATA_HOLDER |
El titular de 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, PERMISSION_DENIED
se debe usar. |
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 de
INVALID_ARGUMENT, este error
indica un problema que se puede solucionar si el estado del sistema cambia. |
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, usa UNAUTHENTICATED para esos errores).
Este código de error no sugiere que la solicitud sea válida o que la
entidad solicitada exista o satisfaga otras condiciones previas. |
RESOURCE_EXHAUSTED |
Algunos recursos se agotaron, 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 podría arrojarse si se llama al
dispense comando de la
DispenseTrait en un dispositivo de alimentación para mascotas, pero no
queda comida en la unidad.Esto también puede deberse a que se excedió una cuota del 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 arroja 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 suberror para obtener más detalles. |