Обработка ошибок в Swift

Содержание

  1. Цель
  2. Примеры кода
  3. Комментарий к коду
  4. ToDo
  5. Источники

Цель

Добавить обработку ошибок в проект на Swift.

Примеры кода

В самом простом случае можно обработать ошибку преобразовав ее в опциональное значение:

if let contents = try? String(contentsOfFile:"/etc/noExistingFile") {
    print(contents)
} else {
    print("No existing file")
}

Перечисления в Swift особенно хорошо подходят для группировки схожих между собой условий возникновения ошибок.

import Foundation

enum FileHandlingError: Error {
    case fileNotFound
}

do {
    guard let contents = try? String(contentsOfFile: "/etc/noExistingFile") else {
        throw FileHandlingError.fileNotFound
    }
    print(contents)
} catch FileHandlingError.fileNotFound {
    print("No existing file")
}

Заменить /etc/noExistingFile на /etc/hosts для примера отображения содержимого файла.

Комментарий к коду

В инструкции do-catch расположен код, который пытается получить данные из файла в виде строки. Если такого файла несуществует вызывается соответствующий обработчик.
FileHandlingError.fileNotFound обрабатывает только случай отсутствия файла, все остальные случае могут быть обработаны пустым условием catch без шаблона и получение ошибки в локальной переменной error. Пример:

catch {
    print("Неожиданная ошибка: (error).")
}

Заметка

В отличие от обработки исключений во многих языках, в том числе и в Objective-C- обработка ошибок в Swift не включает разворачивание стека вызовов, то есть процесса, который может быть дорогим в вычислительном отношении.

ToDo

  1. Добавить пример с инструкцией do-catch с большим количеством обработчиков.
  2. Добавить пример и провести сравнительный анализ для NSError.
  3. Добавить простой пример обработки ошибок для SwiftUI.

Источники

  1. SWIFTBOOK. Обработка ошибок
  2. Swift Apple Documentation. Error protocol
  3. Handling Cocoa Errors in Swift
  4. iOS App Dev Tutorials. Hadling Errors.

Опубликовано

в

от

Метки:

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *