Obsługa błędów na Androidzie

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łasza 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 codemessage, aby dowiedzieć się, co poszło nie tak.

Wszelkie nieobsłużone wyjątki spowodują awarię aplikacji.

W tabeli poniżej znajdziesz znaczenie kodów HomeException, które możesz napotkać:

Tabela: HomeException kody
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.
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.
FAILED_PRECONDITION Operacja została odrzucona, ponieważ system nie znajduje się w stanie wymaganym do jej wykonania. Może się tak zdarzyć, jeśli na przykład stop polecenie OvenCavityOperationalStateTrait zostało wywołane na piekarniku, który już się zatrzymał, lub jeśli próbowano uruchomić operację rmdir na elemencie, który nie jest katalogiem.
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.
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 danej grupie, np. w przypadku kontroli dostępu opartej na użytkownikach, należy użyć 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). 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 np. 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 na przykład wystąpić, gdy wartość stanu otrzymana z zewnętrznego interfejsu API nie zawiera wystarczających informacji o przyczynie głównej.