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