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 = URLErrorcatch
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
- Trasformazione e combinazione degli stream
- Scheduler e threading
- Operatori per la gestione degli errori
- Publisher e subscriber personalizzati