0Pricing
Swift Academy · Lekcja

Operatory obsługi błędów

Odzyskiwanie działania za pomocą catch, retry i replaceError.

Operatory obsługi błędów to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Błędy w Combine

Publishery Combine mają typ Failure. Gdy publisher zgłosi błąd, kończy strumień — nie są emitowane żadne kolejne wartości. Aby tworzyć odporne potoki, potrzebujesz operatorów, które obsługują, przekształcają lub odzyskują po błędach.

Typ Failure

Każdy publisher deklaruje typy Output i Failure. Potok kompiluje się tylko wtedy, gdy typy błędów są zgodne, dlatego często stosuje się operatory zmieniające błędy.

let publisher: AnyPublisher<Data, URLError> = apiClient.request()
// Output = Data, Failure = URLError

catch

catch przechwytuje błąd i zastępuje publisher, który zakończył się błędem, nowym publisherem. Dzięki temu można dostarczyć wartości zastępcze, gdy coś pójdzie nie tak.

apiClient.fetchUser()
    .catch { error in
        Just(User.guest)
    }
    .sink { user in
        print("Got", user.name)
    }
    .store(in: &cancellables)

replaceError

replaceError(with:) to prostsza forma catch: zamienia każdy błąd na pojedynczą wartość zastępczą i pomyślnie kończy działanie.

apiClient.fetchCount()
    .replaceError(with: 0)
    .sink { count in
        self.badge.text = "\(count)"
    }
    .store(in: &cancellables)

retry

retry(n) ponownie subskrybuje publisher znajdujący się wyżej w potoku maksymalnie n razy, gdy ten zgłosi błąd. Doskonale nadaje się do obsługi przejściowych błędów sieci.

apiClient.fetchData()
    .retry(3)
    .sink(receiveCompletion: { print($0) },
          receiveValue: { print($0) })
    .store(in: &cancellables)

Łączenie retry i catch

Typowy wzorzec zapewniający odporność: retry kilka razy, a następnie catch, aby użyć rozwiązania awaryjnego, jeśli wszystkie próby się nie powiodą.

apiClient.fetchData()
    .retry(2)
    .catch { _ in
        Just(Data())
    }
    .sink { data in
        self.process(data)
    }
    .store(in: &cancellables)

mapError

mapError przekształca jeden typ błędu w inny. Jest to niezbędne do ujednolicenia różnych błędów z wielu źródeł w jeden typ błędu na poziomie aplikacji.

enum AppError: Error { case network }

apiClient.request()
    .mapError { _ in AppError.network }
    .sink(receiveCompletion: { _ in }, receiveValue: { _ in })
    .store(in: &cancellables)

Dlaczego mapError ma znaczenie

Gdy łączą Państwo publishery, ich typy Failure muszą się zgadzać. mapError normalizuje niezgodne błędy, dzięki czemu operatory takie jak merge i zip się kompilują, a sink obsługuje jeden typ błędu.

setFailureType

Niektóre publishery, takie jak Just, mają typ błędu Never. setFailureType(to:) umożliwia ich połączenie z publisherami, które mogą kończyć się błędem.

Just(42)
    .setFailureType(to: AppError.self)
    .merge(with: failablePublisher)
    .sink(receiveCompletion: { _ in }, receiveValue: { _ in })
    .store(in: &cancellables)

Obsługa zakończenia

W sink closure zakończenia informuje, czy strumień został zakończony, czy zakończył się błędem. Należy ją sprawdzić, aby reagować na błędy, których nie obsłużono wcześniej w potoku.

publisher.sink(
    receiveCompletion: { completion in
        if case .failure(let error) = completion {
            self.showAlert(error)
        }
    },
    receiveValue: { value in
        self.update(value)
    }
).store(in: &cancellables)

Projektowanie odpornych potoków

Najlepsze praktyki obsługi błędów:

  • Używać retry w przypadku przejściowych błędów
  • Używać catch lub replaceError do obsługi awaryjnej
  • Używać mapError do ujednolicania typów błędów
  • Zawsze obsługiwać przypadek błędu w sink

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat obsługi błędów.

Podsumowanie

Poznali Państwo operatory Combine do obsługi błędów:

  • catch / replaceError — zapewniają rozwiązania awaryjne
  • retry — ponawia próbę po wystąpieniu błędu
  • mapError / setFailureType — ujednolicają typy błędów

Razem pozwalają budować potoki, które płynnie przechodzą do trybu awaryjnego, zamiast kończyć działanie przy pierwszym błędzie.

Często zadawane pytania

Czy lekcja „Operatory obsługi błędów” jest bezpłatna?

Tak — pełny tekst „Operatory obsługi błędów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Operatory obsługi błędów”?

Odzyskiwanie działania za pomocą catch, retry i replaceError. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Operatory obsługi błędów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Przekształcanie i łączenie strumieni
  2. Harmonogramy i wątki
  3. Operatory obsługi błędów
  4. Niestandardowi publisherzy i subskrybenci
← Powrót do Swift Academy