O Kotlin não é compatível com exceções verificadas. Isso simplifica e agiliza o tratamento de erros, porque você pode optar por tratar apenas as exceções que são potencialmente recuperáveis. E como você não precisa lidar explicitamente com todas as exceções possíveis, seu código fica menos confuso e, consequentemente, mais focado no objetivo principal.
As falhas recuperáveis são problemas que um desenvolvedor pode resolver por conta própria.
Por exemplo, se um ID usado em uma chamada não for válido, a API vai gerar um
HomeException com uma mensagem invalid data. O desenvolvedor de apps pode remover esse ID do cache ou mostrar ao usuário uma mensagem como "Estrutura não encontrada".
Exemplo de como lidar com uma falha recuperável:
val result =
try {
homeManager.requestPermissions()
} catch (e: HomeException) {
PermissionsResult(
PermissionsResultStatus.ERROR,
"Got HomeException with error: ${e.message}",
)
}
Qualquer método nas APIs Home pode gerar um
HomeException. Por isso, recomendamos que você use um bloco try-catch para
capturar HomeException em todas as chamadas.
Ao processar HomeException, verifique os campos
error.code e
error.message para saber o que deu errado. Também pode haver códigos de suberro.
Por isso, chame o método
getSubErrorCodes() e verifique o resultado.
Qualquer exceção não processada vai resultar na falha do app.
A tabela a seguir mostra os significados dos códigos HomeException que você
pode encontrar:
| Código | Significado |
|---|---|
ABORTED |
A operação foi cancelada, geralmente devido a um problema de simultaneidade, como uma falha na verificação do sequenciador ou o cancelamento de uma transação. |
ALREADY_EXISTS |
A entidade que um cliente tentou criar, por exemplo, um arquivo ou diretório, já existe. |
API_NOT_CONNECTED |
O cliente tentou chamar um método de uma API que não conseguiu se conectar. Isso pode acontecer quando o dispositivo está off-line ou não oferece suporte à API que o cliente tentou chamar. |
CANCELLED |
A operação foi cancelada, geralmente pelo chamador |
COMMAND_FAILED |
Falha na execução do comando. Verifique os códigos do erro secundários para mais detalhes. |
CURSOR_WINDOW_NOT_SUPPORTED |
Um método que usa um
CursorWindow foi chamado, mas
um CursorWindow não está ativado ou não é compatível com
o contexto atual. |
DATA_LOSS |
Ocorreu uma perda ou corrupção de dados irrecuperável. |
DEADLINE_EXCEEDED |
O prazo expirou antes do término da operação. Para operações que alteram o estado do sistema, este erro pode ser retornado mesmo que a operação tenha sido concluída com sucesso. |
DECOMMISSIONING_INELIGIBLE |
A desativação falhou porque o dispositivo não está qualificado para desativação. |
FAILED_PRECONDITION |
A operação foi rejeitada porque o sistema não está no estado
necessário para a execução da operação. Por exemplo, você poderá receber
essa mensagem se o comando stop da
OvenCavityOperationalStateTrait for chamado em um
forno que já está desligado. |
INTERNAL |
Erros internos. Isso significa que algumas variantes esperadas pelo sistema subjacente foram interrompidas. Esse código do erro é reservado para erros graves. |
INVALID_ARGUMENT |
O cliente forneceu um argumento que está fora do intervalo de valores esperado. |
INVALID_DATA_HOLDER |
O titular dos dados é inválido. |
NOT_FOUND |
Uma entidade solicitada, como um arquivo ou diretório, não foi encontrada.
Se uma solicitação for negada para uma classe inteira de usuários, como a implementação gradual de recursos ou a lista não documentada de permissões, NOT_FOUND poderá ser usado.
Se uma solicitação for negada para alguns usuários de uma classe de usuários,
como o controle de acesso baseado em usuário, PERMISSION_DENIED
precisará ser usado. |
OUT_OF_RANGE |
A operação foi tentada além do intervalo válido, como buscar ou
ler além de end-of-file. Ao contrário de
INVALID_ARGUMENT, esse erro
indica um problema que pode ser corrigido se o estado do sistema mudar. |
PERMISSION_DENIED |
O autor da chamada não tem permissão para executar a operação
especificada. PERMISSION_DENIED não pode ser usado para
rejeições causadas
pelo esgotamento de algum recurso (use RESOURCE_EXHAUSTED
para esses erros).
PERMISSION_DENIED não pode ser usado se o autor da chamada não puder ser
identificado (use UNAUTHENTICATED para esses erros).
Esse código do erro não implica que a solicitação é válida ou que a
entidade solicitada existe ou satisfaz outras condições prévias. |
RESOURCE_EXHAUSTED |
Algum recurso foi esgotado, talvez porque uma cota por usuário
foi atingida ou todo o sistema de arquivos ficou sem espaço.
Por exemplo, esse erro pode ser gerado se o
comando dispense do
DispenseTrait for chamado em um dispositivo de alimentação de animais de estimação, mas
não houver mais comida na unidade.Isso também pode ser devido ao excesso de uma cota de projeto das APIs Home. Para mais informações, consulte Gerenciamento de cotas. |
SDK_INITIALIZATION_MISSING_INFO |
O SDK foi inicializado sem todas as informações necessárias.
Por exemplo, esse erro é gerado se o cliente tentar
receber um TraitFactory para um determinado ID de atributo, mas o atributo não
foi incluído ao inicializar o SDK. Consulte
Inicializar a casa no Android. |
UNAUTHENTICATED |
Não é possível identificar o autor da chamada ou a solicitação não tem credenciais de autenticação válidas. |
UNAVAILABLE |
O serviço está indisponível. Muito provavelmente, trata-se de uma condição temporária, que pode ser corrigida ao tentar novamente com uma espera. Nem sempre é seguro repetir operações não idempotentes. |
UNIMPLEMENTED |
A operação solicitada não foi implementada, permitida ou ativada neste serviço. |
UNKNOWN |
Erro desconhecido. UNKNOWN aparece quando ocorre uma condição de erro
que não pode ser classificada usando nenhum dos outros códigos do erro.
Por exemplo, esse erro pode ser retornado quando um valor de status recebido
de uma API externa não tem informações suficientes
sobre a causa raiz. |
WRITE_FAILED |
Falha na execução da gravação. Verifique os códigos do erro secundários para mais detalhes. |