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ć:
| 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. |