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