Tratamento de erros no iOS

O Swift oferece suporte integrado para gerar e detectar erros recuperáveis no ambiente de execução. Por exemplo, se uma operação no seu código falhar ou não for válida, a API vai gerar um erro HomeError. Isso simplifica e agiliza o tratamento de erros, permitindo que você se concentre apenas nos erros recuperáveis. Em seguida, você pode fornecer opções, como permitir que o usuário tente novamente ou exibir uma mensagem como "Estrutura não encontrada". E como você não precisa tratar explicitamente todas as exceções possíveis, seu código fica menos confuso e, consequentemente, mais focado no objetivo principal.

Um exemplo de como tratar uma falha recuperável:

    let light1 = lightDevices.first
    if let light = light1 {
    do {
      try await structure.move(device: light, to: room)
    } catch let error as HomeError {
      // Code for handling the exception
    }

A tabela a seguir mostra os significados dos HomeError códigos que podem aparecer:

Tabela: HomeError códigos
Código Significado
aborted A operação foi cancelada. Isso geralmente aparece quando há um problema de simultaneidade, como uma falha na verificação de sequência ou cancelamento de transação.
alreadyExists O recurso ou a entidade que você está tentando criar já existe. Por exemplo, uma programação nomeada para um termostato.
cancelled A operação foi cancelada, geralmente pelo autor da chamada.
dataLoss Perda de dados ou corrupção irrecuperável.
deadlineExceeded O prazo expirou antes que a operação pudesse ser concluída. Para operações que alteram o estado do sistema, esse erro pode ser retornado mesmo que a operação tenha sido concluída com sucesso. Por exemplo, uma resposta bem-sucedida de um servidor pode ter sido atrasada tempo suficiente para que o prazo expirasse.
failedPrecondition 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 chamar stop em um forno que já está parado.
internal Erros internos. Significa que algumas invariantes esperadas pelo sistema subjacente foram corrompidas. Esse código do erro é reservado para erros graves.
invalidArgument O cliente especificou um argumento inválido. Observe que isso é diferente de `failedPrecondition`. `invalidArgument` indica argumentos problemáticos, independentemente do estado do sistema . Por exemplo, um nome de arquivo incorreto.
notFound Você especificou uma entidade ou um recurso que não pode ser encontrado. Por exemplo, especificar um ID de faixa inexistente ao chamar play em um dispositivo de player de mídia.
outOfRange Um parâmetro excedeu o intervalo válido, com base no estado atual do sistema estado. Essa mensagem ocorre quando o valor está dentro do intervalo de valores que a chamada de API pode aceitar, mas não faz sentido no contexto atual.
permissionDenied Você não tem permissão para executar a operação especificada. Esse código do erro não deve ser interpretado como uma indicação de que a solicitação é válida.
resourceExhausted Algum recurso foi esgotado. Por exemplo, isso pode ser gerado quando alguém chama dispense(item:amount:unit:presetName:) em um dispositivo de alimentação de animais de estimação e não há mais comida na unidade.

Isso também pode ocorrer devido ao excesso de uma cota do projeto das APIs Home. Para mais informações, consulte Gerenciamento de cotas.
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 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. De modo geral, 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.