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 API. Подробнее об управлении квотами… |
SDK_INITIALIZATION_MISSING_INFO |
SDK был инициализирован без всей необходимой информации.
Например, эта ошибка возникает, если клиент пытается получить TraitFactory для определенного идентификатора признака, но этот признак не был включен при инициализации SDK. Подробнее о том, как инициализировать дом на устройстве Android… |
UNAUTHENTICATED |
Не удалось идентифицировать вызывающую сторону, или в запросе указаны недействительные учетные данные для аутентификации. |
UNAVAILABLE |
Сервис недоступен. Скорее всего, это временная проблема, которую можно решить, повторив попытку с экспоненциальной задержкой. Обратите внимание, что повторные попытки неидемпотентных операций не всегда безопасны. |
UNIMPLEMENTED |
Запрошенная операция не реализована, не поддерживается или не включена в этом сервисе. |
UNKNOWN |
Неизвестная ошибка. UNKNOWN появляется при возникновении ошибки, которую нельзя классифицировать с помощью других кодов ошибок.
Например, эта ошибка может возвращаться, когда значение статуса, полученное от внешнего API, не содержит достаточной информации об основной причине. |
WRITE_FAILED |
Не удалось выполнить запись. Дополнительную информацию можно найти в дополнительных кодах ошибок. |