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