Обработка ошибок в 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:) на кормушке для домашних животных, в которой закончился корм.

Это также может быть связано с превышением квоты проекта Home API. Подробнее об управлении квотами…
unauthenticated Не удалось идентифицировать вызывающую сторону, или в запросе указаны недействительные учетные данные для аутентификации.
unavailable Сервис недоступен. Скорее всего, это временная проблема, которую можно решить, повторив попытку с экспоненциальной задержкой. Обратите внимание, что повторные попытки неидемпотентных операций не всегда безопасны.
unimplemented Запрошенная операция не реализована, не поддерживается или не включена в этом сервисе.
unknown Неизвестная ошибка. Как правило, код unknown появляется, когда возникает ошибка, которую нельзя классифицировать с помощью других кодов. Например, эта ошибка может быть возвращена, когда значение статуса, полученное от внешнего API, не содержит достаточной информации об основной причине.