Обработка ошибок на iOS

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 , с которыми вы можете столкнуться:

Таблица: Коды 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, не содержит достаточной информации о первопричине.