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 code
i message
, 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ć:
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. |