Kotlin non supporta le eccezioni controllate. Questo semplifica e ottimizza la gestione degli errori, perché puoi scegliere di gestire solo le eccezioni potenzialmente recuperabili. Inoltre, poiché non devi gestire esplicitamente ogni possibile eccezione, il codice è meno ingombrante e, di conseguenza, rimane più incentrato sul suo scopo principale.
Gli errori recuperabili sono problemi che uno sviluppatore può risolvere dalla sua parte.
Ad esempio, se un ID utilizzato in una chiamata non è valido, l'API genera un HomeException con un messaggio invalid data. Lo sviluppatore di app può quindi scegliere di rimuovere l'ID dalla cache o di mostrare all'utente un messaggio come "Struttura non trovata".
Ecco 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
error.code e
error.message per scoprire cosa è andato storto. Potrebbero essere presenti anche codici di errore secondari, quindi chiama il
getSubErrorCodes() metodo e controlla il risultato.
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 controllo del sequencer non riuscito o un'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 è riuscita 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. |
COMMAND_FAILED |
L'esecuzione del comando non è riuscita. Per ulteriori dettagli, controlla i codici di errore secondari. |
CURSOR_WINDOW_NOT_SUPPORTED |
È stato chiamato un metodo che utilizza un
CursorWindow, ma
un CursorWindow non è abilitato o non è supportato nel
contesto attuale. |
DATA_LOSS |
Si è verificata una perdita o un danneggiamento dei dati non recuperabili. |
DEADLINE_EXCEEDED |
La scadenza è trascorsa prima che l'operazione potesse essere completata. Per le operazioni che modificano lo stato del sistema, questo errore può essere restituito anche se l'operazione è stata completata correttamente. |
DECOMMISSIONING_INELIGIBLE |
La disattivazione non è riuscita perché il dispositivo non è idoneo alla disattivazione. |
FAILED_PRECONDITION |
L'operazione è stata rifiutata perché il sistema non si trova in uno 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à spento. |
INTERNAL |
Errori interni. Ciò significa che sono state violate alcune invarianti previste dal sistema sottostante. Questo codice di errore è riservato agli errori gravi. |
INVALID_ARGUMENT |
Il client ha fornito un argomento che non rientra nell'intervallo di valori previsto. |
INVALID_DATA_HOLDER |
Il titolare dei dati non è valido. |
NOT_FOUND |
Non è stata trovata un'entità richiesta, ad esempio un file o una directory.
Se una richiesta viene rifiutata per un'intera classe di utenti, ad esempio un lancio graduale
di funzionalità o una lista consentita non documentata, NOT_FOUND
può essere utilizzato.
Se una richiesta viene rifiutata per alcuni utenti all'interno di una classe di utenti,
ad esempio il controllo dell'accesso basato sull'utente, PERMISSION_DENIED
deve essere utilizzato. |
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 può 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 alcune risorse (utilizza RESOURCE_EXHAUSTED per questi errori).
PERMISSION_DENIED non deve essere utilizzato se il chiamante non può essere
identificato (utilizza UNAUTHENTICATED per questi errori).
Questo codice di errore non implica che la richiesta sia valida o che l'
entità richiesta esista o soddisfi altre precondizioni. |
RESOURCE_EXHAUSTED |
Alcune risorse sono state esaurite, forse perché è stata raggiunta una quota per utente
essendo raggiunta o l'intero file system esaurito lo spazio.
Ad esempio, questo errore potrebbe essere generato se il
dispense comando di
DispenseTrait viene chiamato su un dispositivo di alimentazione per animali domestici, ma non è rimasto altro cibo nell'unità.Questo potrebbe anche essere dovuto al superamento di una quota del progetto delle API Home. Per saperne di più, consulta Gestione delle quote. |
SDK_INITIALIZATION_MISSING_INFO |
L'SDK è stato inizializzato senza tutte le informazioni richieste.
Ad esempio, questo errore viene generato se il client tenta di
ottenere 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 |
Il chiamante non può essere identificato o la richiesta non ha credenziali di autenticazione valide. |
UNAVAILABLE |
Il servizio non è disponibile. Si tratta molto probabilmente di una condizione temporanea, 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 nessuno 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. |
WRITE_FAILED |
L'esecuzione della scrittura non è riuscita. Per ulteriori dettagli, controlla i codici di errore secondari. |