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