0Pricing
Swift Academy · Lezione

Operatori per la gestione degli errori

Recuperi dagli errori con catch, retry e replaceError.

Operatori per la gestione degli errori è una lezione Swift Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Swift Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Swift Academy include 4 lezioni in totale.

Gli errori in Combine

I publisher di Combine hanno un tipo Failure. Quando un publisher fallisce, termina lo stream: non vengono emessi altri valori. Per creare pipeline resilienti sono necessari operatori che gestiscano, trasformino o recuperino dagli errori.

Il tipo Failure

Ogni publisher dichiara un tipo Output e un tipo Failure. Una pipeline viene compilata solo quando i tipi di errore sono compatibili, perciò sono comuni gli operatori che modificano gli errori.

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

catch

catch intercetta un errore e sostituisce il publisher che ha fallito con uno nuovo. In questo modo può fornire valori di fallback quando qualcosa va storto.

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

replaceError

replaceError(with:) è una forma più semplice di catch: sostituisce qualsiasi errore con un singolo valore di fallback e completa l'esecuzione con successo.

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

retry

retry(n) si sottoscrive nuovamente all'upstream fino a n volte quando si verifica un errore. È ideale per gli errori di rete transitori.

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

Combinare retry e catch

Un pattern resiliente comune: eseguire retry alcune volte, quindi usare catch per ricorrere a un'alternativa se tutti i tentativi falliscono.

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

mapError

mapError trasforma un tipo di errore in un altro. È essenziale per unificare diversi errori provenienti da monte in un singolo tipo di errore a livello applicativo.

enum AppError: Error { case network }

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

Perché mapError è importante

Quando combina publisher, i relativi tipi Failure devono corrispondere. mapError normalizza gli errori non compatibili, permettendo la compilazione di operatori come merge e zip e consentendo al Suo sink di gestire un solo tipo di errore.

setFailureType

Alcuni publisher, come Just, hanno il tipo di errore Never. setFailureType(to:) fa da ponte, consentendo loro di combinarsi con publisher che possono generare errori.

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

Gestire il completamento

In sink, la closure di completamento indica se il flusso è terminato o non è riuscito. La esamini per reagire agli errori che non sono stati recuperati a monte.

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

Progettare pipeline resilienti

Buone pratiche per la gestione degli errori:

  • Utilizzi retry per gli errori transitori
  • Utilizzi catch o replaceError per le alternative
  • Utilizzi mapError per unificare i tipi di errore
  • Gestisca sempre il caso di errore in sink

Verifica rapida

Metta alla prova le Sue conoscenze sulla gestione degli errori.

Riepilogo

Ha imparato a conoscere gli operatori di Combine per la gestione degli errori:

  • catch / replaceError — forniscono alternative
  • retry — riprova in caso di errore
  • mapError / setFailureType — unificano i tipi di errore

Insieme consentono di costruire pipeline che si degradano in modo controllato invece di interrompersi al primo errore.

Domande Frequenti

La lezione «Operatori per la gestione degli errori» è gratuita?

Sì — il testo completo di «Operatori per la gestione degli errori» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Swift Academy, passa a CoddyKit PRO. Il corso Swift Academy include 4 lezioni in totale.

Cosa imparerò in «Operatori per la gestione degli errori»?

Recuperi dagli errori con catch, retry e replaceError. Eserciti Swift Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Swift Academy?

Non è richiesta alcuna esperienza precedente. Swift Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Operatori per la gestione degli errori»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Swift Academy?

Sì. Ogni lezione Swift Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Trasformazione e combinazione degli stream
  2. Scheduler e threading
  3. Operatori per la gestione degli errori
  4. Publisher e subscriber personalizzati
← Torna a Swift Academy