Обработка ошибок на 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 проверьте его code и поля message , чтобы узнать, что пошло не так.

Любые необработанные исключения приведут к сбою вашего приложения.

В следующей таблице приведены значения кодов HomeException , с которыми вы можете столкнуться:

Таблица: Коды исключений HomeException
Код Значение
ABORTED Операция была прервана, как правило, из-за проблемы параллелизма, такой как сбой проверки секвенсора или прерывание транзакции.
ALREADY_EXISTS Объект, который клиент пытался создать, например файл или каталог, уже существует.
API_NOT_CONNECTED Клиент попытался вызвать метод из API, к которому не удалось подключиться. Это может произойти, если устройство находится в автономном режиме или не поддерживает API, который клиент пытался вызвать.
CANCELLED Операция была отменена, как правило, звонившим.
DATA_LOSS Произошла невосстановимая потеря или повреждение данных.
DEADLINE_EXCEEDED Крайний срок истёк до завершения операции. Для операций, изменяющих состояние системы, эта ошибка может возвращаться даже при успешном завершении операции.
FAILED_PRECONDITION Операция была отклонена, поскольку система не находится в состоянии, необходимом для её выполнения. Например, это сообщение может появиться, если команда stop OvenCavityOperationalStateTrait была вызвана для уже остановленной печи, или если вы попытались выполнить операцию rmdir для объекта, не являющегося каталогом.
INTERNAL Внутренние ошибки. Это означает, что некоторые инварианты, ожидаемые базовой системой, были нарушены. Этот код ошибки зарезервирован для серьёзных ошибок.
INVALID_ARGUMENT Клиент предоставил аргумент, выходящий за пределы ожидаемого диапазона значений.
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 вызывается на устройстве-кормушке для животных, но в устройстве больше не осталось корма.
SDK_INITIALIZATION_MISSING_INFO SDK был инициализирован без всей необходимой информации. Например, эта ошибка возникает, если клиент пытается получить TraitFactory для заданного идентификатора трейта, но этот трейт не был указан при инициализации SDK. См. раздел Инициализация главного окна на Android .
UNAUTHENTICATED Невозможно идентифицировать вызывающего абонента или запрос не имеет действительных учетных данных аутентификации.
UNAVAILABLE Служба недоступна. Скорее всего, это временная ситуация, которую можно исправить, повторив попытку с отсрочкой. Обратите внимание, что повторные попытки неидемпотентных операций не всегда безопасны.
UNIMPLEMENTED Запрошенная операция не реализована, не поддерживается и не включена в данной службе.
UNKNOWN Неизвестная ошибка. Код UNKNOWN появляется при возникновении ошибки, которую невозможно классифицировать ни одним из других кодов. Например, эта ошибка может возвращаться, когда значение статуса, полученное от внешнего API, не содержит достаточной информации о первопричине.