Swift:
Virheiden käsittely

Kuinka toimia:

Swift käyttää virheenkäsittelyyn do, try ja catch -lohkoja. Katsotaanpa esimerkkiä:

enum FileError: Error {
    case fileDoesNotExist
    case noPermission
}

func readFile(atPath path: String) throws -> String {
    // Kuvittele, että meillä on tässä jonkinlaista logiikkaa tiedoston olemassaolon ja lukuoikeuden tarkistamiseen
    let fileExists = false
    let havePermission = true

    if !fileExists {
        throw FileError.fileDoesNotExist
    }

    if !havePermission {
        throw FileError.noPermission
    }

    return "Tiedoston sisältö tulee tähän"
}

do {
    let fileContent = try readFile(atPath: "/polku/tiedostoon")
    print(fileContent)
} catch FileError.fileDoesNotExist {
    print("Hupsista! Tiedostoa ei löydy.")
} catch FileError.noPermission {
    print("Ah! Ei lukuoikeutta tiedostoon.")
} catch {
    print("Tuntematon virhe tapahtui.")
}

Esimerkkituloste:

Hupsista! Tiedostoa ei löydy.

Syväsukellus

Virheenkäsittely ei aina ollut yhtä sujuvaa kuin nyt. Objective-C:ssä käsiteltiin NSError-objektien osoittimia, mikä tuntui kömpelöltä. Nyt meillä on tyylikkäämpi järjestelmä Swiftin enumien ja Error-protokollan ansiosta.

Swiftin throw antaa meille mahdollisuuden viestiä, että jokin meni pieleen. do-lohkot toimivat kuin virheentietoisina alueina, try-etuliite kutsuu riskialttiita toimintoja, ja catch käsittelee asiat, jos ne menevät mönkään.

Optionaalit ovat vaihtoehto tilanteille, jotka eivät aivan yllä “virhe”-statukseen, mutta saattavat silti olla “tulos puuttuu”. Ne ovat vähän kuin Schrödingerin muuttujat—niillä on arvo, tai sitten ei.

Todelliseen syvyyteen tutustu Result-tyyppeihin, jotka ovat hienostuneita hybridejä tavallisten paluu- ja virhemallien välillä.

Katso myös