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