Kotlin non supporta le eccezioni verificate. In questo modo, la gestione degli errori viene semplificata e ottimizzata, perché puoi scegliere di gestire solo le eccezioni potenzialmente recuperabili. Inoltre, poiché non devi gestire esplicitamente ogni possibile eccezione, il codice è meno disordinato e, di conseguenza, rimane più incentrato sul suo scopo principale.
Gli errori recuperabili sono problemi che uno sviluppatore può risolvere autonomamente.
Ad esempio, se un ID utilizzato in una chiamata non è valido, l'API genera un messaggio HomeException
con un messaggio invalid data
. Lo sviluppatore dell'app può quindi scegliere di rimuovere l'ID dalla cache o mostrare all'utente un messaggio come "Struttura non trovata".
Un esempio di come gestire un errore recuperabile:
val result =
try {
homeManager.requestPermissions()
} catch (e: HomeException) {
PermissionsResult(
PermissionsResultStatus.ERROR,
"Got HomeException with error: ${e.message}",
)
}
Qualsiasi metodo nelle API Home può generare un HomeException
, pertanto ti consigliamo di utilizzare un blocco try-catch
per intercettare HomeException
in tutte le chiamate.
Quando gestisci HomeException
, controlla i campi code
e message
per scoprire cosa è andato storto.
Eventuali eccezioni non gestite causeranno l'arresto anomalo dell'app.
La tabella seguente fornisce i significati dei codici HomeException
che potresti riscontrare:
Codice | Significato |
---|---|
ABORTED
| L'operazione è stata interrotta, in genere a causa di un problema di concorrenza, ad esempio un errore di controllo del sequenziatore o l'interruzione della transazione. |
ALREADY_EXISTS |
L'entità che un client ha tentato di creare, ad esempio un file o una directory, esiste già. |
API_NOT_CONNECTED |
Il client ha tentato di chiamare un metodo da un'API che non è riuscito a connettersi. Questo può accadere quando il dispositivo è offline o non supporta l'API che il client ha tentato di chiamare. |
CANCELLED |
L'operazione è stata annullata, in genere dal chiamante. |
DATA_LOSS |
Si è verificata una perdita o un danneggiamento dei dati non recuperabili. |
DEADLINE_EXCEEDED |
La scadenza è scaduta prima del completamento dell'operazione. Per le operazioni che modificano lo stato del sistema, questo errore può essere restituito anche se l'operazione è stata completata correttamente. |
FAILED_PRECONDITION |
L'operazione è stata rifiutata perché il sistema non è nello stato
richiesto per l'esecuzione dell'operazione. Ad esempio, potresti ricevere questo messaggio se il comando stop di OvenCavityOperationalStateTrait è stato chiamato su un forno già fermo o se hai tentato di eseguire un'operazione rmdir su una non directory. |
INTERNAL |
Errori interni. Ciò significa che alcune invarianti previste dal sistema di base sono state violate. Questo codice di errore è riservato per errori gravi. |
INVALID_ARGUMENT |
Il client ha fornito un argomento che non rientra nell'intervallo di valori previsto. |
NOT_FOUND |
Non è stata trovata un'entità richiesta, ad esempio un file o una directory.
Se una richiesta viene rifiutata per un'intera categoria di utenti, ad esempio per un graduale
implementazione di funzionalità o per una lista consentita non documentata, può essere utilizzato NOT_FOUND .
Se una richiesta viene rifiutata per alcuni utenti all'interno di una classe di utenti,
ad esempio il controllo dell'accesso basato sugli utenti, deve essere utilizzato PERMISSION_DENIED . |
OUT_OF_RANGE |
L'operazione è stata tentata oltre l'intervallo valido, ad esempio la ricerca o la lettura oltre end-of-file . A differenza di INVALID_ARGUMENT , questo errore indica un problema che potrebbe essere risolto se lo stato del sistema cambia. |
PERMISSION_DENIED |
Il chiamante non dispone dell'autorizzazione per eseguire l'operazione specificata. PERMISSION_DENIED non deve essere utilizzato per i rifiuti causati dall'esaurimento di una risorsa (utilizza RESOURCE_EXHAUSTED per questi errori).
PERMISSION_DENIED non deve essere utilizzato se non è possibile identificare il chiamante (utilizza UNAUTHENTICATED per questi errori).
Questo codice di errore non implica che la richiesta sia valida o che l'entità richiesta esista o soddisfi altri prerequisiti. |
RESOURCE_EXHAUSTED |
È stata esaurita una risorsa, forse a causa del raggiungimento di una quota per utente o perché lo spazio dell'intero file system è esaurito.
Ad esempio, questo errore potrebbe verificarsi se il comando dispense di DispenseTrait viene chiamato su un dispositivo per l'alimentazione degli animali domestici, ma non c'è più cibo nell'unità. |
SDK_INITIALIZATION_MISSING_INFO |
L'SDK è stato inizializzato senza tutte le informazioni richieste.
Ad esempio, questo errore viene generato se il client tenta di recuperare un TraitFactory per un determinato ID tratto, ma il tratto non è stato incluso durante l'inizializzazione dell'SDK. Consulta
Inizializzare la casa su Android. |
UNAUTHENTICATED |
L'utente che chiama non può essere identificato o la richiesta non ha credenziali di autenticazione valide. |
UNAVAILABLE |
Il servizio non è disponibile. Molto probabilmente si tratta di una condizione transitoria, che può essere corretta riprovando con un backoff. Tieni presente che non è sempre sicuro riprovare le operazioni non idempotenti. |
UNIMPLEMENTED |
L'operazione richiesta non è implementata, supportata o abilitata in questo servizio. |
UNKNOWN |
Errore sconosciuto. UNKNOWN viene visualizzato quando si verifica una condizione di errore
che non può essere classificata utilizzando uno degli altri codici di errore.
Ad esempio, questo errore può essere restituito quando un valore di stato ricevuto
da un'API esterna non contiene informazioni sufficienti
sulla causa principale. |