Menu
Coddy logo textTech

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.

challenge icon

Sfida

Medio

Costruisci 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 successo
  • negative quando parseSafe genera un errore
  • too big quando capStrict genera un errore

Per l'input 10,-1,200,42, l'output è:

ok: 10
negative
too big
ok: 42

Provalo tu

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum StepError; parseSafe; capStrict; processStep;
// para cada parte, do/try processStep, catch cada rama, print
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Playground Swift