Kotlin не поддерживает проверяемые исключения. Это упрощает обработку ошибок, поскольку вы можете выбрать, какие исключения обрабатывать. Поскольку вам не нужно обрабатывать каждое возможное исключение, код становится менее загроможденным и более ориентированным на основную задачу.
Сбои, которые можно устранить, – это проблемы, которые разработчик может решить на своей стороне.
Например, если идентификатор, используемый в вызове, недействителен, API выдает ошибку HomeException с сообщением invalid data. После этого разработчик приложения может удалить идентификатор из кеша или показать пользователю сообщение, например "Структура не найдена".
Пример того, как можно обработать восстанавливаемую ошибку:
val result =
try {
homeManager.requestPermissions()
} catch (e: HomeException) {
PermissionsResult(
PermissionsResultStatus.ERROR,
"Got HomeException with error: ${e.message}",
)
}
Любой метод в Home API может вызвать исключение
HomeException, поэтому мы рекомендуем использовать блок try-catch для обработки HomeException во всех вызовах.
При работе с HomeException проверьте поля
error.code и
error.message, чтобы узнать, что пошло не так. Также могут быть вложенные коды ошибок, поэтому вызовите метод
getSubErrorCodes() и проверьте результат.
Если исключение не обработано, приложение завершит работу.
В таблице ниже приведены значения кодов HomeException, которые могут встретиться:
| Код | Значение |
|---|---|
ABORTED |
Операция была прервана, как правило, из-за проблемы с параллелизмом, например из-за сбоя проверки последовательности или прерывания транзакции. |
ALREADY_EXISTS |
Объект, который клиент пытался создать (например, файл или каталог), уже существует. |
API_NOT_CONNECTED |
Клиент попытался вызвать метод из API, к которому не удалось подключиться. Это может произойти, если устройство не подключено к интернету или не поддерживает API, который пытался вызвать клиент. |
CANCELLED |
Операция отменена, как правило, отправителем вызова. |
COMMAND_FAILED |
Не удалось выполнить команду. Чтобы узнать больше, проверьте коды дополнительных ошибок. |
CURSOR_WINDOW_NOT_SUPPORTED |
Был вызван метод, использующий CursorWindow, но CursorWindow не включен или не поддерживается в текущем контексте. |
DATA_LOSS |
Произошла неустранимая потеря или повреждение данных. |
DEADLINE_EXCEEDED |
Конечный срок завершился до того, как операция была выполнена. Для операций, которые изменяют состояние системы, эта ошибка может быть возвращена, даже если операция была успешно завершена. |
DECOMMISSIONING_INELIGIBLE |
Вывод из эксплуатации не удался, так как устройство не соответствует требованиям. |
FAILED_PRECONDITION |
Операция отклонена, поскольку система находится в состоянии, не позволяющем ее выполнить. Например, это сообщение может появиться, если команда stop из OvenCavityOperationalStateTrait была вызвана для духовки, которая уже выключена. |
INTERNAL |
Внутренние ошибки, Это означает, что некоторые инварианты, ожидаемые базовой системой, были нарушены. Этот код ошибки зарезервирован для серьезных ошибок. |
INVALID_ARGUMENT |
Клиент предоставил аргумент, который находится за пределами ожидаемого диапазона значений. |
INVALID_DATA_HOLDER |
Недействительный владелец данных. |
NOT_FOUND |
Запрошенный объект, например файл или каталог, не найден.
Если запрос отклоняется для целой группы пользователей, например при постепенном развертывании функции или использовании незадокументированного белого списка, можно использовать NOT_FOUND.
Если запрос отклоняется для некоторых пользователей в группе, например при управлении доступом на основе пользователей, необходимо использовать PERMISSION_DENIED. |
OUT_OF_RANGE |
Операция была выполнена за пределами допустимого диапазона, например при попытке перейти к позиции или прочитать данные после end-of-file. В отличие от ошибки INVALID_ARGUMENT, эта ошибка указывает на проблему, которую можно устранить, изменив состояние системы. |
PERMISSION_DENIED |
У вызывающего пользователя нет разрешения на выполнение указанной операции. PERMISSION_DENIED нельзя использовать для отклонений, вызванных исчерпанием какого-либо ресурса (для таких ошибок используйте RESOURCE_EXHAUSTED).
PERMISSION_DENIED нельзя использовать, если отправителя запроса нельзя идентифицировать (в таких случаях используйте UNAUTHENTICATED).
Этот код ошибки не означает, что запрос действителен, а запрошенный объект существует или соответствует другим предварительным условиям. |
RESOURCE_EXHAUSTED |
Исчерпан какой-либо ресурс, возможно, из-за достижения квоты на пользователя или нехватки места в файловой системе.
Например, эта ошибка может возникнуть, если команда dispense из DispenseTrait вызывается на устройстве для кормления домашних животных, но в нем больше нет еды.Это также может быть связано с превышением квоты проекта Home APIs. Подробнее об управлении квотами… |
SDK_INITIALIZATION_MISSING_INFO |
SDK был инициализирован без всей необходимой информации.
Например, эта ошибка возникает, если клиент пытается получить TraitFactory для определенного идентификатора признака, но признак не был включен при инициализации SDK. Подробнее о том, как инициализировать дом на устройстве Android… |
UNAUTHENTICATED |
Не удалось идентифицировать вызывающего абонента или в запросе нет действительных учетных данных для аутентификации. |
UNAVAILABLE |
Сервис недоступен. Скорее всего, это временная проблема, которую можно устранить, повторив попытку с задержкой. Обратите внимание, что повторно выполнять неидемпотентные операции не всегда безопасно. |
UNIMPLEMENTED |
Запрошенная операция не реализована, не поддерживается или не включена в этом сервисе. |
UNKNOWN |
Неизвестная ошибка. UNKNOWN – ошибка, которую нельзя отнести ни к одной из других категорий.
Например, эта ошибка может быть возвращена, когда значение статуса, полученное от внешнего API, не содержит достаточно информации о первопричине. |
WRITE_FAILED |
Не удалось выполнить запись. Чтобы узнать больше, проверьте коды дополнительных ошибок. |