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ż
- Oficjalny przewodnik po obsłudze błędów Swift: Apple Docs
- Najlepsze praktyki obsługi błędów w Swifcie: RayWenderlich.com
- Zaawansowana obsługa błędów w Swifcie: artykuł na Medium