Обработка ошибок на Android

Kotlin не поддерживает проверенные исключения . Это упрощает и оптимизирует обработку ошибок, поскольку вы можете выбрать обработку только тех исключений, которые потенциально можно восстановить. И поскольку вам не нужно явно обрабатывать каждое возможное исключение, ваш код менее загроможден и, следовательно, остается более сосредоточенным на своей основной цели.

Восстанавливаемые сбои — это проблемы, которые разработчик может решить со своей стороны. Например, если идентификатор, используемый в вызове, недействителен, API выдает исключение HomeException с сообщением о invalid data . Затем разработчик приложения может либо удалить этот идентификатор из своего кэша, либо показать пользователю сообщение типа «Структура не найдена».

Пример того, как можно справиться с устранимым сбоем:

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

Любой метод в API Home может выдать исключение 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, не содержит достаточной информации о первопричине.