Swift предоставляет встроенную поддержку генерации и перехвата восстановимых ошибок во время выполнения. Например, если операция в вашем коде завершается сбоем или недопустима, API выдаёт ошибку HomeError . Это упрощает и оптимизирует обработку ошибок, позволяя сосредоточиться только на восстановимых ошибках. Затем вы можете предоставить варианты, например, позволить пользователю повторить попытку или вывести сообщение типа «Структура не найдена». Поскольку вам не нужно явно обрабатывать все возможные исключения, ваш код становится менее перегруженным и, следовательно, более сфокусированным на своей основной задаче.
Пример того, как можно справиться с восстановимым сбоем:
    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
    }
 В следующей таблице приведены значения кодов HomeError , с которыми вы можете столкнуться:
| Код | Значение | 
|---|---|
 aborted | Операция была прервана. Обычно это происходит при возникновении проблемы с параллельным выполнением, например, при сбое проверки последовательности или прерывании транзакции. | 
 alreadyExists | Ресурс или сущность, которую вы пытаетесь создать, уже существует. Например, это может быть именованное расписание для термостата. | 
 cancelled | Операция была отменена, как правило, звонившим. | 
 dataLoss | Невосстановимая потеря или повреждение данных. | 
 deadlineExceeded | Срок истек до завершения операции. Для операций, изменяющих состояние системы, эта ошибка может возвращаться даже при успешном завершении. Например, успешный ответ от сервера мог быть отложен достаточно долго, чтобы срок истек. | 
 failedPrecondition |  Операция была отклонена, поскольку система не находится в состоянии, необходимом для её выполнения. Например, это сообщение может появиться, если вы вызвали команду stop для уже остановленной печи. | 
 internal | Внутренние ошибки. Это означает, что некоторые инварианты, ожидаемые базовой системой, были нарушены. Этот код ошибки зарезервирован для серьёзных ошибок. | 
 invalidArgument | Клиент указал недопустимый аргумент. Обратите внимание, что это отличается от `failedPrecondition`. `invalidArgument` указывает на аргументы, которые являются проблемными независимо от состояния системы (например, неверное имя файла). | 
 notFound |  Вы указали сущность или ресурс, которые невозможно найти. Например, указали несуществующий идентификатор трека при вызове функции play на медиаплеере. | 
 outOfRange | Параметр вышел за пределы допустимого диапазона, установленного в текущем состоянии системы. Это сообщение появляется, когда значение находится в диапазоне значений, которые вызов API потенциально может принять, но не имеет смысла в текущем контексте. | 
 permissionDenied | У вас нет разрешения на выполнение указанной операции. Этот код ошибки не следует интерпретировать как подтверждение того, что запрос в остальном действителен. | 
 resourceExhausted |  Какой-то ресурс исчерпан. Например, эта ошибка может возникнуть при вызове метода dispense(item:amount:unit:presetName:) на устройстве кормушки для животных, когда в нём больше не осталось еды. | 
 unauthenticated | Невозможно идентифицировать вызывающего абонента или запрос не имеет действительных учетных данных аутентификации. | 
 unavailable | Служба недоступна. Скорее всего, это временная ситуация, которую можно исправить, повторив попытку с отсрочкой. Обратите внимание, что повторные попытки неидемпотентных операций не всегда безопасны. | 
 unimplemented | Запрошенная операция не реализована, не поддерживается и не включена в данной службе. | 
 unknown |  Неизвестная ошибка. Как правило, код unknown появляется, когда возникает ошибка, которую невозможно классифицировать ни одним из других кодов ошибок. Например, эта ошибка может быть возвращена, если значение статуса, полученное от внешнего API, не содержит достаточной информации о первопричине.  |