Обработка ошибок на устройствах Android

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, которые могут встретиться:

Таблица: 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 Не удалось выполнить запись. Чтобы узнать больше, проверьте коды дополнительных ошибок.