do, try, catch
Fa parte della sezione Logica e flusso del percorso Swift di Coddy. Lezione 45 di 56.
La forma completa per gestire gli errori è do/try/catch:
enum DivError: Error { case byZero }
func divide(_ a: Int, _ b: Int) throws -> Int {
if b == 0 { throw DivError.byZero }
return a / b
}
do {
let r = try divide(10, 2)
print(r) // 5
} catch DivError.byZero {
print("can't divide by zero")
} catch {
print("unknown error")
}try va prima di qualsiasi chiamata che può generare un errore. Se la chiamata genera un errore, il controllo passa al catch corrispondente; altrimenti, l’esecuzione prosegue oltre il blocco do.
Le clausole catch multiple vengono eseguite dall'alto verso il basso e vince la prima corrispondenza, proprio come in uno switch. Il catch senza argomenti alla fine è il caso predefinito: quasi sempre è opportuno inserirne uno per evitare errori del compilatore.
Sfida
FacileDefinisci un enum ParseError: Error con tre casi: empty, notInteger e negative.
Definisci una funzione che può generare errori parsePositive(_ s: String) throws -> Int che:
- Genera
.emptyquandos, dopo aver rimosso gli spazi bianchi, è vuota - Genera
.notIntegerquandosnon può essere analizzata comeInt - Genera
.negativequando il valore analizzato è< 0 - Altrimenti restituisce il valore analizzato
Leggi una singola riga da stdin e chiama parsePositive in un blocco do/catch. Stampa:
got: <n>in caso di successoerror: empty,error: not integeroerror: negativeper ciascun caso
Per l'input 42, l'output è got: 42. Per una riga vuota, è error: empty. Per abc è error: not integer.
Provalo tu
let line = readLine()!
// TODO: enum ParseError; func parsePositive(_:) throws -> Int;
// do/try/catch con tre rami più il ramo che gestisce tutti gli altri casi
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