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, dlatego 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, np. pliku lub katalogu.
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. próba wyszukania lub odczytania danych poza wartością 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).
Nie można używać kodu PERMISSION_DENIED, jeśli nie można zidentyfikować dzwoniącego (w przypadku takich błędów użyj kodu 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 domu 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 innych 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ę wykonać zapisu. Więcej informacji znajdziesz w kodach błędów podrzędnych. |