O Kotlin não oferece suporte a exceções verificadas. Isso simplifica e agiliza o tratamento de erros, porque você pode escolher tratar apenas as exceções que podem ser recuperadas. Como não é necessário tratar explicitamente todas as exceções possíveis, o código fica menos confuso e, consequentemente, mais focado na finalidade principal.
Falhas recuperáveis são problemas que um desenvolvedor pode resolver.
Por exemplo, se um ID usado em uma chamada não for válido, a API vai gerar uma HomeException com uma mensagem de 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 tratar 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 uma
HomeException. Por isso, recomendamos que você use um try-catch para
detectar HomeException em todas as chamadas.
Ao tratar HomeException, verifique os campos
error.code e
error.message para saber o que deu errado. Também pode haver códigos de sub-erro
também. Portanto, chame o
getSubErrorCodes() método e verifique o resultado.
Qualquer exceção não tratada vai resultar em falha do app.
A tabela a seguir mostra os significados dos códigos HomeException que podem aparecer:
| Código | Significado |
|---|---|
ABORTED |
A operação foi cancelada, normalmente devido a um problema de simultaneidade, como falha na verificação do sequenciador ou cancelamento da 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. Confira os códigos de sub-erro 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 no
contexto atual. |
DATA_LOSS |
Ocorreu perda de dados ou corrupção 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 estado do sistema não é o necessário
para a execução dela. Por exemplo, você pode receber
essa mensagem se o stop comando do
OvenCavityOperationalStateTrait for chamado em um
forno que já está parado. |
INTERNAL |
Erros internos. Significa que algumas invariantes esperadas pelo sistema subjacente foram corrompidas. Este código do erro é reservado para erros graves. |
INVALID_ARGUMENT |
O cliente forneceu um argumento que está fora do intervalo esperado de valores. |
INVALID_DATA_HOLDER |
O detentor de 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 uma implementação gradual
de recursos ou uma 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, como o controle de acesso baseado em usuário, PERMISSION_DENIED precisará ser usado. |
OUT_OF_RANGE |
Houve uma tentativa da operação depois do intervalo válido, como a busca ou a
leitura após o end-of-file. Diferentemente de
INVALID_ARGUMENT, este erro
indica um problema que poderá 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. Em vez dele, use RESOURCE_EXHAUSTED para esses erros.
PERMISSION_DENIED não poderá ser usado se o autor da chamada não for
identificado. Em vez dele, use UNAUTHENTICATED para esses erros.
Esse código do erro não indica que a solicitação seja válida nem que a
entidade solicitada exista ou satisfaça outras condições prévias. |
RESOURCE_EXHAUSTED |
Houve o esgotamento de algum recurso, talvez devido a uma cota por usuário
atingida ou a todo o sistema de arquivos ficar sem espaço.
Por exemplo, esse erro poderá ser gerado se o
dispense comando 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 ocorrer 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 |
O autor da chamada não pode ser identificado 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 retirada. Note que 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 de 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. Confira os códigos de sub-erro para mais detalhes. |