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