Obsługa błędów na Androidzie

Kotlin nie obsługuje wyjątków sprawdzanych. Dzięki temu uprościsz i usprawnisz obsługę błędów, ponieważ możesz obsługiwać tylko te wyjątki, które można potencjalnie odzyskać. Ponieważ nie musisz wyraźnie obsługiwać wszystkich możliwych wyjątków, Twój kod jest mniej zatłoczony i w konsekwencji pozostaje bardziej skoncentrowany na swoim głównym celu.

Odwracalne błędy 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 zwróci błąd HomeException z wiadomością invalid data. Deweloper aplikacji może usunąć ten identyfikator z pamięci podręcznej lub wyświetlić użytkownikowi komunikat, np. „Nie znaleziono struktury”.

Przykład sposobu obsługiwania odwracalnych błędów:

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 wywołać błądHomeException, dlatego zalecamy użycie bloku try-catch, aby przechwytywać błądHomeException we wszystkich wywołaniach.

Podczas obsługi HomeException sprawdź pola codemessage, aby dowiedzieć się, co poszło nie tak.

Każdy nieobsługiwany wyjątek spowoduje awarię aplikacji.

W tabeli poniżej znajdziesz oznaczenia 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, na przykład plik lub katalog, już istnieje.
API_NOT_CONNECTED Klient próbował wywołać metodę interfejsu API, która nie mogła nawiązać połączenia. Może się tak zdarzyć, gdy urządzenie jest offline lub nie obsługuje interfejsu API, do którego klient próbuje się odwołać.
CANCELLED Operacja została anulowana, zwykle przez element wywołujący.
DATA_LOSS Nieodwracalna utrata danych lub ich uszkodzenie.
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żesz na przykład otrzymać tę wiadomość, jeśli wywołano polecenie stop klasy OvenCavityOperationalStateTrait na piekarniku, który jest już zatrzymany, lub jeśli spróbujesz wykonać operację rmdir na pliku, 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 spoza oczekiwanego zakresu wartości.
NOT_FOUND Nie znaleziono żądanej encji, np. pliku lub katalogu. Jeśli prośba zostanie odrzucona w przypadku całej grupy użytkowników, na przykład w przypadku stopniowego wprowadzania funkcji lub nieudokumentowanej listy dozwolonych, można użyć NOT_FOUND. Jeśli prośba zostanie odrzucona w przypadku niektórych użytkowników w danej klasie użytkowników, należy użyć PERMISSION_DENIED, na przykład kontroli dostępu na podstawie użytkownika.
OUT_OF_RANGE Operacja została podjęta poza prawidłowym zakresem, na przykład przesunięcie lub odczyt poza end-of-file. W przeciwieństwie do błędu INVALID_ARGUMENT ten błąd wskazuje 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. Wartości PERMISSION_DENIED nie można używać w przypadku odrzuceń spowodowanych wyczerpaniem zasobu (w przypadku tych błędów należy użyć wartości RESOURCE_EXHAUSTED). Nie należy używać parametru PERMISSION_DENIED, jeśli nie można zidentyfikować dzwoniącego (w przypadku takich błędów należy użyć parametru UNAUTHENTICATED). Ten kod błędu nie oznacza, że żądanie jest prawidłowe ani że żądany obiekt istnieje lub spełnia inne warunki wstępne.
RESOURCE_EXHAUSTED Pewien zasób został wyczerpany, być może z powodu osiągnięcia limitu na użytkownika lub wyczerpania miejsca na dysku w całym systemie plików. Ten błąd może wystąpić na przykład, gdy wywołane zostanie polecenie dispense w urządzeniu DispenseTrait, ale nie ma już w nim jedzenia.
SDK_INITIALIZATION_MISSING_INFO Pakiet SDK został zainicjowany bez wszystkich wymaganych informacji. Ten błąd może wystąpić na przykład, gdy klient próbuje uzyskać TraitFactory dla danego atrybutu, ale atrybut nie został uwzględniony podczas inicjowania pakietu SDK. Zapoznaj się z artykułem Inicjowanie domu na urządzeniu z Androidem.
UNAUTHENTICATED Nie można zidentyfikować dzwoniącego lub żądanie nie zawiera 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 większym odstępem. Pamiętaj, że ponowne próby wykonania operacji nie idempotentnych nie zawsze są bezpieczne.
UNIMPLEMENTED Żądana operacja 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 innych kodów błędów. Ten błąd może zostać zwrócony, gdy wartość stanu otrzymana z zewnętrznego interfejsu API nie zawiera wystarczających informacji dotyczących przyczyny błędu.