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 dalla sua parte.
Ad esempio, se un ID utilizzato in una chiamata non è valido, l'API genera un errore
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
    
    error.code e 
    error.message per scoprire cosa è andato storto. Potrebbero essere presenti anche codici di errore secondari, quindi chiama il metodo 
    getSubErrorCodes() e controlla il risultato.
Qualsiasi eccezione non gestita causerà l'arresto anomalo dell'app.
La tabella seguente fornisce i significati dei codici HomeException che potresti incontrare:
| 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 a cui non è stato possibile connettersi. Ciò 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. Controlla i codici di errore secondari per maggiori dettagli. | 
| CURSOR_WINDOW_NOT_SUPPORTED | È stato chiamato un metodo che utilizza un CursorWindow, ma
      unCursorWindownon è abilitato o non è supportato
      nel contesto attuale. | 
| DATA_LOSS | Si è verificata una perdita o un danneggiamento dei dati non recuperabili. | 
| DEADLINE_EXCEEDED | La scadenza è terminata 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 nello stato
        richiesto per l'esecuzione dell'operazione. Ad esempio, potresti ricevere
        questo messaggio se il comando stopdiOvenCavityOperationalStateTraitè stato chiamato su un
        forno già spento. | 
| INTERNAL | Errori interni. Ciò significa che alcuni invarianti previsti dal sistema sottostante sono stati violati. Questo codice di errore è riservato a errori gravi. | 
| INVALID_ARGUMENT | Il client ha fornito un argomento che non rientra nell'intervallo previsto di valori. | 
| INVALID_DATA_HOLDER | Il titolare dei dati non è valido. | 
| NOT_FOUND | Impossibile trovare un'entità richiesta, ad esempio un file o una directory.
        Se una richiesta viene negata per un'intera classe di utenti, ad esempio un lancio graduale
        di funzionalità o una lista consentita non documentata, NOT_FOUNDpotrebbe essere utilizzata.
        Se una richiesta viene negata per alcuni utenti all'interno di una classe di utenti,
        come il controllo dell'accesso basato sull'utente,PERMISSION_DENIEDdeve 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 diINVALID_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_DENIEDnon deve essere utilizzato per i rifiuti causati dall'esaurimento di alcune risorse (utilizzaRESOURCE_EXHAUSTEDper questi errori).PERMISSION_DENIEDnon deve essere utilizzato se il chiamante non può essere
        identificato (utilizzaUNAUTHENTICATEDper 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
        o perché lo spazio del file system è terminato.
        Ad esempio, questo errore potrebbe essere generato se il
        comando dispensedelDispenseTraitviene chiamato su un dispositivo per l'alimentazione di animali domestici, ma non
        è rimasto 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
        ottenere un TraitFactoryper un determinato ID caratteristica, ma la caratteristica
        non è stata inclusa durante l'inizializzazione dell'SDK. Vedi
        Inizializzare la casa su Android. | 
| UNAUTHENTICATED | La persona che chiama non può essere identificata 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. UNKNOWNviene 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 dispone di informazioni sufficienti
        sulla causa principale. | 
| WRITE_FAILED | L'operazione di scrittura non è stata eseguita. Controlla i codici di errore secondari per maggiori dettagli. |