Swift:
Обработка ошибок
Как:
Swift использует обработку ошибок с помощью блоков do
, try
и catch
. Давайте посмотрим:
enum FileError: Error {
case fileDoesNotExist
case noPermission
}
func readFile(atPath path: String) throws -> String {
// Представим, что у нас есть некоторая логика здесь, чтобы проверить, существует ли файл и имеем ли мы разрешение на его чтение
let fileExists = false
let havePermission = true
if !fileExists {
throw FileError.fileDoesNotExist
}
if !havePermission {
throw FileError.noPermission
}
return "Содержимое файла идет здесь"
}
do {
let fileContent = try readFile(atPath: "/path/to/file")
print(fileContent)
} catch FileError.fileDoesNotExist {
print("Ой! Файл не найден.")
} catch FileError.noPermission {
print("Ах! Нет разрешения на чтение файла.")
} catch {
print("Произошла неизвестная ошибка.")
}
Пример вывода:
Ой! Файл не найден.
Глубокое Погружение
Обработка ошибок не всегда была такой изящной, как сейчас. В Objective-C вы имели дело с указателями на объекты NSError, что казалось громоздким. Теперь у нас есть более элегантная система с перечислениями Swift и протоколом Error
.
throw
в Swift позволяет нам сигнализировать о том, что что-то пошло не так. Блоки do
действуют как области, осведомленные об ошибках, префикс try
вызывает рискованные операции, а catch
обрабатывает ситуации, если что-то идет не так.
Опционалы являются альтернативой для ситуаций, которые не совсем “статус ошибки”, но все же могут иметь “нет результата”. Они немного похожи на переменные Шрёдингера — у них есть значение или его нет.
Для действительного погружения рекомендуется ознакомиться с типами Result
, которые являются стильными гибридами между обычными возвращаемыми значениями и шаблонами ошибок.
Смотрите также
- Официальное руководство по обработке ошибок Swift: Apple Docs
- Лучшие практики обработки ошибок в Swift: RayWenderlich.com
- Продвинутая обработка ошибок в Swift: Статья на Medium