Gestione degli errori su Android

Kotlin non supporta le eccezioni controllate. 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ù concentrato 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 errore 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'eccezione HomeException, pertanto ti consigliamo di utilizzare un blocco try-catch per rilevare HomeException su tutte le chiamate.

Quando gestisci HomeException, controlla i campi error.code e error.message per scoprire cosa non ha funzionato. Potrebbero esserci anche codici di errore secondari, quindi chiama il metodo getSubErrorCodes() 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 incontrare:

Tabella: codici HomeException
Codice Significato
ABORTED L'operazione è stata interrotta, in genere a causa di un problema di concorrenza, ad esempio un errore di controllo del sequencer 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 Esecuzione del comando non riuscita. Per maggiori 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 recuperabile.
DEADLINE_EXCEEDED La scadenza è trascorsa prima che l'operazione potesse essere completata. Per le operazioni che modificano lo stato del sistema, questo errore potrebbe essere restituito anche se l'operazione è stata completata correttamente.
DECOMMISSIONING_INELIGIBLE Il ritiro non è riuscito perché il dispositivo non è idoneo per il ritiro.
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 del OvenCavityOperationalStateTrait è stato chiamato su un forno che è già stato spento.
INTERNAL Errori interni. Ciò significa che alcuni invarianti previsti dal sistema sottostante sono stati violati. 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 Un'entità richiesta, ad esempio un file o una directory, non è stata trovata. Se una richiesta viene rifiutata per un'intera classe di utenti, ad esempio un'implementazione graduale di una funzionalità o una lista consentita non documentata, è possibile utilizzare NOT_FOUND. Se una richiesta viene rifiutata per alcuni utenti all'interno di una classe di utenti, ad esempio il controllo degli accessi basato sugli utenti, è necessario utilizzare PERMISSION_DENIED.
OUT_OF_RANGE È stato eseguito un tentativo di operazione 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 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, probabilmente perché è stata raggiunta una quota per utente o perché lo spazio nel file system è esaurito. Ad esempio, questo errore potrebbe essere generato se il comando dispense di DispenseTrait viene chiamato su un dispositivo per l'alimentazione degli animali domestici, ma non è rimasto cibo nell'unità.

Ciò potrebbe anche essere dovuto al superamento di una quota di 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 Inizializza la casa su Android.
UNAUTHENTICATED Impossibile identificare il chiamante o la richiesta non dispone di 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 potrebbe essere restituito quando un valore di stato ricevuto da un'API esterna non contiene informazioni sufficienti sulla causa principale.
WRITE_FAILED Impossibile eseguire la scrittura. Per maggiori dettagli, controlla i codici di errore secondari.