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