Propagazione degli errori
Fa parte della sezione Logica e flusso del percorso Swift di Coddy. Lezione 47 di 56.
Una funzione che può generare errori può chiamare altre funzioni che possono generare errori. L’errore si propaga fino al do/catch più vicino automaticamente, senza bisogno di rilanciarlo manualmente.
enum AuthError: Error { case badUser, badPass }
func loadUser(_ name: String) throws -> String {
if name.isEmpty { throw AuthError.badUser }
return name
}
func login(_ name: String, _ pass: String) throws -> String {
let u = try loadUser(name) // propaga l'errore
if pass.count < 4 { throw AuthError.badPass }
return "hello \(u)"
}
do {
print(try login("", "abcd"))
} catch AuthError.badUser {
print("missing user")
} catch AuthError.badPass {
print("weak password")
}Leggi dall’alto verso il basso: login chiama loadUser con try. Se loadUser genera un’eccezione, l’errore salta il corpo di login e arriva al catch esterno. Scrivi ogni passaggio in modo che fallisca rapidamente e lascia che sia il chiamante a decidere cosa fare.
Sfida
MedioCostruisci una piccola pipeline di due passaggi che generano errori.
Definisci StepError: Error con due casi: negative, tooBig.
Definisci parseSafe(_ s: String) throws -> Int: genera .negative quando l'intero analizzato è minore di 0, altrimenti lo restituisce. (Supponi che l'input venga analizzato correttamente; te ne sei occupato altrove.)
Definisci capStrict(_ n: Int) throws -> Int: genera .tooBig quando n > 100, altrimenti restituisce n.
Definisci processStep(_ s: String) throws -> Int che chiama prima parseSafe e poi capStrict, lasciando propagare qualsiasi errore.
Leggi una singola riga di input: un elenco di stringhe separate da virgole. Per ciascuna, chiama processStep in un do/catch e stampa una riga:
ok: <n>in caso di successonegativequandoparseSafegenera un erroretoo bigquandocapStrictgenera un errore
Per l'input 10,-1,200,42, l'output è:
ok: 10
negative
too big
ok: 42Provalo tu
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum StepError; parseSafe; capStrict; processStep;
// para cada parte, do/try processStep, catch cada rama, print
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Conteggio e indiciMaiuscole, minuscole e rimozione degli spaziRicerca nelle stringheSuddivisione e unioneSostituzione di sottostringheRiepilogo - Verifica del nome utente4Insiemi
Creare insiemiUnione e intersezioneDifferenza e differenza simmetricaSottoinsieme e sovrainsiemeRiepilogo - Filtro per tag7Progetto - Tracciatore di abitudini
Panoramica del progettoSegna come completato10Progetto - Motore di quiz
Panoramica del progettoPorre domande2Intervalli e passi
Intervalli chiusi e semiapertiPassoMetodi degli intervalliIntervalli in switchRiepilogo - Griglia del calendario5Funzioni di ordine superiore Parte 1
MapFilterReduceConcatenare map, filter e reduceRiepilogo - Statistiche sulle parole3Dizionari
Dichiarare i dizionariRicerca facoltativaAggiornare i dizionariIterare sui dizionariRaggruppare i valoriRipasso - Inventario6Funzioni di ordine superiore Parte 2
compactMapflatMapsorted(by:)Creare pipelineRiepilogo - Classifica9Gestione degli errori
throws ed Errordo, try, catchtry? e try!Propagazione degli erroriRipasso - Calcolatrice sicuraEsercitati da solo: Playground Swift