Swift zapewnia wbudowaną obsługę zgłaszania i przechwytywania błędów możliwych do naprawienia w czasie działania. Jeśli na przykład operacja w kodzie nie powiedzie się lub jest nieprawidłowa, interfejs API zgłasza błąd HomeError. Upraszcza to i usprawnia obsługę błędów, ponieważ pozwala skupić się tylko na błędach, które można naprawić. Możesz wtedy udostępnić opcje, takie jak umożliwienie użytkownikowi ponownej próby lub wyświetlenie komunikatu „Nie znaleziono struktury”. A ponieważ nie musisz jawnie obsługiwać każdego możliwego wyjątku, kod jest mniej zagracony i dzięki temu bardziej skupiony na swoim głównym celu.
Przykład sposobu postępowania w przypadku błędu, który można naprawić:
let light1 = lightDevices.first
if let light = light1 {
do {
try await structure.move(device: light, to: room)
} catch let error as HomeError {
// Code for handling the exception
}
W tabeli poniżej znajdziesz znaczenie kodów HomeError, które mogą się pojawić:
| Kod | Znaczenie |
|---|---|
aborted |
Operacja została przerwana. Zwykle pojawia się, gdy występuje problem z równoczesnością, np. nieudana kontrola sekwencji lub przerwanie transakcji. |
alreadyExists |
Zasób lub encja, które próbujesz utworzyć, już istnieją. Może to być na przykład nazwany harmonogram termostatu. |
cancelled |
Operacja została anulowana, zwykle przez element wywołujący. |
dataLoss |
Utrata lub uszkodzenie danych, których nie można odzyskać. |
deadlineExceeded |
Termin upłynął, zanim operacja została ukończona. 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. Na przykład odpowiedź z serwera mogła zostać opóźniona na tyle, że upłynął termin. |
failedPrecondition |
Operacja została odrzucona, ponieważ system nie znajduje się w stanie wymaganym do jej wykonania. Możesz na przykład zobaczyć ten komunikat, jeśli wywołasz metodę stop na piekarniku, który został już wyłączony. |
internal |
Błędy wewnętrzne. Oznacza to, że niektóre niezmienniki oczekiwane przez system bazowy zostały naruszone. Ten kod błędu jest zarezerwowany dla poważnych błędów. |
invalidArgument |
Klient podał nieprawidłowy argument. Zwróć uwagę, że różni się to od `failedPrecondition`. `invalidArgument` wskazuje argumenty, które są problematyczne niezależnie od stanu systemu (np. nieprawidłowa nazwa pliku). |
notFound |
Podano encję lub zasób, których nie można znaleźć. Na przykład podanie nieistniejącego identyfikatora ścieżki podczas wywoływania metody
play na urządzeniu odtwarzacza multimedialnego. |
outOfRange |
Parametr przekroczył prawidłowy zakres na podstawie bieżącego stanu systemu. Ten komunikat pojawia się, gdy wartość mieści się w zakresie wartości, które wywołanie interfejsu API może potencjalnie zaakceptować, ale nie ma sensu w obecnym kontekście. |
permissionDenied |
Nie masz uprawnień do wykonania określonej operacji. Ten kod błędu nie oznacza, że żądanie jest prawidłowe. |
resourceExhausted |
Niektóre zasoby zostały wyczerpane. Może on zostać wywołany na przykład wtedy, gdy użytkownik wywoła
dispense(item:amount:unit:presetName:) na urządzeniu do karmienia zwierząt, a w urządzeniu nie ma już karmy.Może to być też spowodowane przekroczeniem limitu projektu interfejsów Home API. Więcej informacji znajdziesz w artykule o zarządzaniu limitami. |
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 najprawdopodobniej stan przejściowy, który można skorygować, ponawiając próbę z wycofaniem. 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. Ogólnie rzecz biorąc, błąd unknown pojawia się, gdy wystąpi błąd, którego nie można sklasyfikować za pomocą żadnego z pozostałych kodów błędów. Ten błąd może zostać zwrócony na przykład wtedy, gdy wartość stanu otrzymana z zewnętrznego interfejsu API nie zawiera wystarczających informacji o głównej przyczynie. |