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 , с которыми вы можете столкнуться:
| Код | Значение |
|---|---|
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 | Операция записи не удалась. Для получения более подробной информации проверьте коды ошибок. |