Obsługa błędów na Androidzie

Kotlin nie obsługuje sprawdzanych wyjątków. Upraszcza to i usprawnia obsługę błędów, ponieważ możesz obsługiwać tylko te wyjątki, które można potencjalnie naprawić. Ponieważ nie musisz jawnie 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 na przykład identyfikator użyty w wywołaniu jest nieprawidłowy, interfejs API zgłasza wyjątek HomeException z komunikatem invalid data (nieprawidłowe dane). Deweloper aplikacji może wtedy usunąć ten identyfikator z pamięci podręcznej lub wyświetlić użytkownikowi komunikat „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 API Home może zgłosić wyjątek HomeException, dlatego zalecamy używanie bloku try-catch do przechwytywania 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 as well, dlatego wywołaj metodę getSubErrorCodes() i sprawdź wynik.

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

W tabeli poniżej znajdziesz znaczenie kodów HomeException, które mogą się pojawić:

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 offline lub nie obsługuje interfejsu API, który próbował wywołać klient.
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 CursorWindow, ale CursorWindow nie jest włączona lub nie jest obsługiwana w bieżącym kontekście.
DATA_LOSS Wystąpiła nieodwracalna utrata lub uszkodzenie 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 Nie udało się wycofać urządzenia z eksploatacji, ponieważ nie kwalifikuje się ono do wycofania z eksploatacji.
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 polecenie stop elementu OvenCavityOperationalStateTrait zostało wywołane w przypadku piekarnika, który jest już wyłączony.
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 jest spoza oczekiwanego zakresu wartości.
INVALID_DATA_HOLDER Kontener danych jest nieprawidłowy.
NOT_FOUND Nie znaleziono żądanego elementu, takiego jak plik lub katalog. Jeśli żądanie zostanie odrzucone w przypadku całej klasy użytkowników, np. w przypadku stopniowego wdrażania funkcji lub nieudokumentowanej listy dozwolonych, NOT_FOUND można użyć. Jeśli żądanie zostanie odrzucone w przypadku niektórych użytkowników w ramach klasy użytkowników, takich jak kontrola dostępu oparta na użytkownikach, PERMISSION_DENIED należy użyć.
OUT_OF_RANGE Podjęto próbę wykonania operacji poza prawidłowym zakresem, np. wyszukiwania lub odczytywania poza end-of-file. W przeciwieństwie do 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. PERMISSION_DENIED nie należy używać w przypadku odrzucenia spowodowanego wyczerpaniem zasobów (w takich przypadkach użyj kodu RESOURCE_EXHAUSTED w przypadku tych błędów). PERMISSION_DENIED nie należy używać, jeśli nie można zidentyfikować elementu wywołującego (w takich przypadkach użyj kodu UNAUTHENTICATED). Ten kod błędu nie oznacza, że żądanie jest prawidłowe ani że żądana encja istnieje lub spełnia inne warunki wstępne.
RESOURCE_EXHAUSTED Wyczerpał się jakiś zasób, być może z powodu osiągnięcia limitu na użytkownika lub braku miejsca w całym systemie plików. Ten błąd może się na przykład pojawić, jeśli polecenie dispense elementu DispenseTrait zostanie wywołane w przypadku urządzenia do karmienia zwierząt, ale w pojemniku nie ma już karmy.

Może to być też spowodowane przekroczeniem limitu projektu interfejsów API Home. Więcej informacji znajdziesz w artykule Zarządzanie limitami.
SDK_INITIALIZATION_MISSING_INFO Zestaw SDK został zainicjowany bez wszystkich wymaganych informacji. Ten błąd jest na przykład zgłaszany, jeśli klient próbuje uzyskać TraitFactory dla danego identyfikatora elementu, ale element nie został uwzględniony podczas inicjowania zestawu SDK. Zapoznaj się z artykułem Inicjowanie usługi Home na Androidzie.
UNAUTHENTICATED Nie można zidentyfikować elementu 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 czasem do ponowienia. Pamiętaj, że ponawianie prób operacji, które nie są idempotentne, nie zawsze jest bezpieczne.
UNIMPLEMENTED Wybrana czynność nie jest wdrożona, 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ę wykonać zapisu. Więcej informacji znajdziesz w kodach błędów podrzędnych.