Swift:
Obsługa błędów

Jak to zrobić:

Swift wykorzystuje obsługę błędów za pomocą bloków do, try i catch. Spójrzmy na to:

enum FileError: Error {
    case fileDoesNotExist
    case noPermission
}

func readFile(atPath path: String) throws -> String {
    // Załóżmy, że mamy tutaj jakąś logikę sprawdzającą, czy plik istnieje i czy mamy uprawnienia do jego odczytu
    let fileExists = false
    let havePermission = true

    if !fileExists {
        throw FileError.fileDoesNotExist
    }

    if !havePermission {
        throw FileError.noPermission
    }

    return "Zawartość pliku znajduje się tutaj"
}

do {
    let fileContent = try readFile(atPath: "/ścieżka/do/pliku")
    print(fileContent)
} catch FileError.fileDoesNotExist {
    print("Ups! Plik nie został znaleziony.")
} catch FileError.noPermission {
    print("A! Brak uprawnień do odczytu pliku.")
} catch {
    print("Wystąpił nieznany błąd.")
}

Przykładowe wyjście:

Ups! Plik nie został znaleziony.

Glebsze zanurzenie

Obsługa błędów nie zawsze była tak wyrafinowana jak teraz. W Objective-C miałeś do czynienia z wskaźnikami do obiektów NSError, co wydawało się niezgrabne. Teraz mamy bardziej elegancki system z enumami Swift i protokołem Error.

throw w Swifcie pozwala nam sygnalizować, że coś poszło nie tak. Bloki do działają jak obszary świadome błędów, try oznacza ryzykowną operację, a catch radzi sobie z sytuacjami, gdy coś pójdzie nie tak.

Opcjonalne (ang. optionals) to alternatywa dla sytuacji, które nie są do końca “stanem błędu”, ale mogą nadal nie mieć “wyniku”. Są trochę jak zmienne Schrödingera – mają wartość albo jej nie mają.

Dla prawdziwej głębi zbadaj typy Result, które są świetnymi hybrydami między standardowym zwracaniem wyników a wzorcami błędów.

Zobacz również