Kotlin nie obsługuje wyjątków sprawdzanych. Upraszcza to i usprawnia obsługę błędów, ponieważ możesz obsługiwać tylko te wyjątki, które potencjalnie można odzyskać. A ponieważ nie musisz wyraźnie obsługiwać każdego możliwego wyjątku, Twój kod jest mniej zagmatwany i dzięki temu bardziej skupiony na swoim głównym celu.
Błędy, które można naprawić, to problemy, które deweloper może rozwiązać po swojej stronie.
Jeśli np. identyfikator użyty w wywołaniu jest nieprawidłowy, interfejs API zgłosi błąd HomeException
z komunikatem invalid data
. Deweloper aplikacji może wtedy usunąć ten identyfikator z pamięci podręcznej lub wyświetlić użytkownikowi komunikat, np. „Nie znaleziono struktury”.
Przykład obsługi błędu, który można naprawić:
val result =
try {
homeManager.requestPermissions()
} catch (e: HomeException) {
PermissionsResult(
PermissionsResultStatus.ERROR,
"Got HomeException with error: ${e.message}",
)
}
Każda metoda w interfejsach Home API może zgłosić wyjątek
HomeException
, dlatego zalecamy używanie bloku try-catch
do przechwytywania wyjątku HomeException
we wszystkich wywołaniach.
Podczas obsługi HomeException
sprawdź pola
error.code
i
error.message
, aby dowiedzieć się, co poszło nie tak. Mogą też występować kody błędów podrzędnych, więc wywołaj metodę
getSubErrorCodes()
i sprawdź wynik.
Wszelkie nieobsłużone wyjątki spowodują awarię aplikacji.
W tabeli poniżej znajdziesz znaczenie kodów HomeException
, które możesz napotkać:
Kod | Znaczenie |
---|---|
ABORTED |
Operacja została przerwana, najczęściej z powodu problemu równoczesności, np. w przypadku nieudanej kontroli sekwencera lub przerwanej transakcji. |
ALREADY_EXISTS |
Encja, którą próbował utworzyć klient, np. plik lub katalog, już istnieje. |
API_NOT_CONNECTED |
Klient próbował wywołać metodę z interfejsu API, z którym nie udało się nawiązać połączenia. Może się tak zdarzyć, gdy urządzenie jest w trybie offline lub nie obsługuje interfejsu API, do którego klient próbował się odwołać. |
CANCELLED |
Operacja została anulowana, zwykle przez element wywołujący. |
COMMAND_FAILED |
Nie udało się wykonać polecenia. Więcej informacji znajdziesz w kodach błędów podrzędnych. |
CURSOR_WINDOW_NOT_SUPPORTED |
Wywołano metodę, która używa elementu CursorWindow , ale element CursorWindow nie jest włączony lub nie jest obsługiwany w bieżącym kontekście. |
DATA_LOSS |
Doszło do nieodwracalnej utraty lub uszkodzenia danych. |
DEADLINE_EXCEEDED |
Termin upłynął przed wykonaniem operacji. W przypadku operacji, które zmieniają stan systemu, ten błąd może zostać zwrócony nawet wówczas, gdy operacja zakończyła się pomyślnie. |
DECOMMISSIONING_INELIGIBLE |
Wycofanie nie powiodło się, ponieważ urządzenie nie kwalifikuje się do wycofania. |
FAILED_PRECONDITION |
Operacja została odrzucona, ponieważ system nie znajduje się w stanie wymaganym do jej wykonania. Ten komunikat może się na przykład pojawić, jeśli stop polecenie OvenCavityOperationalStateTrait zostało wywołane w przypadku piekarnika, który już się zatrzymał. |
INTERNAL |
Błędy wewnętrzne. Oznacza to, że pewne niezmienniki oczekiwane przez system bazowy zostały uszkodzone. Ten kod błędu jest zarezerwowany dla poważnych błędów. |
INVALID_ARGUMENT |
Klient podał argument, który wykracza poza oczekiwany zakres wartości. |
INVALID_DATA_HOLDER |
Podmiot danych jest nieprawidłowy. |
NOT_FOUND |
Nie znaleziono żądanego elementu, takiego jak plik lub katalog.
Jeśli prośba zostanie odrzucona w przypadku całej grupy użytkowników, np. w wyniku stopniowego wdrażania funkcji lub nieudokumentowanej listy dozwolonych, można użyć kodu NOT_FOUND .
Jeśli prośba zostanie odrzucona w przypadku niektórych użytkowników w ramach klasy użytkowników, np. w przypadku kontroli dostępu opartej na użytkownikach, należy użyć parametru PERMISSION_DENIED . |
OUT_OF_RANGE |
Operacja została podjęta poza prawidłowym zakresem, np. wyszukiwanie lub odczytywanie poza end-of-file . W przeciwieństwie do błędu INVALID_ARGUMENT ten błąd wskazuje na problem, który można rozwiązać, jeśli zmieni się stan systemu. |
PERMISSION_DENIED |
Element wywołujący nie ma uprawnień do wykonania określonej operacji. Kodu PERMISSION_DENIED nie należy używać w przypadku odrzuceń spowodowanych wyczerpaniem zasobów (w takich przypadkach używaj kodu RESOURCE_EXHAUSTED ).
PERMISSION_DENIED nie może być używany, jeśli nie można zidentyfikować dzwoniącego (w przypadku takich błędów użyj UNAUTHENTICATED ).
Ten kod błędu nie oznacza, że żądanie jest prawidłowe ani że żądany podmiot istnieje lub spełnia inne warunki wstępne. |
RESOURCE_EXHAUSTED |
Jeden z zasobów został wyczerpany, być może z powodu osiągnięcia limitu na użytkownika lub wyczerpania miejsca w całym systemie plików.
Ten błąd może wystąpić na przykład wtedy, gdy polecenie dispense interfejsu dispense zostanie wywołane na urządzeniu do karmienia zwierząt, ale w urządzeniu nie będzie już karmy.DispenseTrait |
SDK_INITIALIZATION_MISSING_INFO |
Pakiet SDK został zainicjowany bez wszystkich wymaganych informacji.
Ten błąd jest zgłaszany na przykład wtedy, gdy klient próbuje uzyskać TraitFactory dla danego identyfikatora cechy, ale cecha nie została uwzględniona podczas inicjowania pakietu SDK. Zobacz Inicjowanie strony głównej na Androidzie. |
UNAUTHENTICATED |
Nie można zidentyfikować wywołującego lub żądanie nie ma prawidłowych danych uwierzytelniających. |
UNAVAILABLE |
Usługa jest niedostępna. Jest to najczęściej stan przejściowy, który można rozwiązać, ponawiając próbę z wycofywaniem. Pamiętaj, że ponawianie operacji nieidempotentnych nie zawsze jest bezpieczne. |
UNIMPLEMENTED |
Żądana operacja nie jest zaimplementowana, obsługiwana ani włączona w tej usłudze. |
UNKNOWN |
Nieznany błąd. UNKNOWN pojawia się, gdy wystąpi błąd, którego nie można zaklasyfikować za pomocą żadnego z pozostałych kodów błędów.
Ten błąd może być na przykład zwracany, gdy wartość stanu otrzymana z zewnętrznego interfejsu API nie zawiera wystarczających informacji o przyczynie głównej. |
WRITE_FAILED |
Nie udało się zapisać danych. Więcej informacji znajdziesz w kodach błędów podrzędnych. |