Как отлавливать ошибки в Swift?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Swift ошибки отлавливаются с помощью системы обработки ошибок, основанной на использовании ключевых слов throw, throws, try и блока do-catch.
-
Объявление функций, которые могут выбрасывать ошибки: Используется ключевое слово
throwsпосле параметров функции.enum DataError: Error { case emptyData case invalidFormat } func processData(input: String) throws -> String { guard !input.isEmpty else { throw DataError.emptyData // Выбрасываем ошибку } // ...логика обработки данных... if input == "invalid" { throw DataError.invalidFormat } return "Processed: \(input)" } -
Вызов функций, которые могут выбрасывать ошибки: Используется ключевое слово
try.do { // Блок для обработки ошибок let result = try processData(input: "valid data") print(result) // "Processed: valid data" } catch { // Блок для перехвата ошибок print("An error occurred: \(error)") } -
Перехват отдельных типов ошибок: В блоке
catchможно указать конкретный тип ошибки для перехвата.do { let result = try processData(input: "") print(result) } catch DataError.emptyData { print("Data is empty, please provide input.") } catch DataError.invalidFormat { print("Data format is invalid.") } catch { // Перехват любых других ошибок print("An unexpected error occurred: \(error)") } -
deferблок: Выполняется непосредственно перед выходом из текущей области видимости, независимо от того, было ли исключение или нет. Часто используется для очистки ресурсов.func openFile(_ filename: String) throws -> String { // Предположим, это открывает файл и возвращает его содержимое print("Opening file \(filename)") // ... логика открытия ... defer { // Этот код выполнится перед выходом из функции, // даже если произойдет ошибка print("Closing file \(filename)") } // ... обработка файла ... if filename == "error.txt" { throw DataError.invalidFormat // Выбрасываем ошибку } return "File content" } do { let content = try openFile("data.txt") print(content) } catch { print("Error handling file: \(error)") } -
Опциональный
try?: Возвращает опциональное значение. Если функция выбрасывает ошибку,try?возвращаетnil.let processedResult = try? processData(input: "") // processedResult будет nil let validResult = try? processData(input: "abc") // validResult будет опциональным String с значением "Processed: abc" -
Принудительное извлечение
try!: Используется, когда вы уверены, что ошибка не произойдет. Если ошибка все же произойдет, приложение аварийно завершится. Используйте с осторожностью.// Используйте только если вы на 100% уверены, что функция не кинет ошибку let result = try! processData(input: "always valid input")
Система на основе do-catch является более явным и безопасным способом обработки ошибок по сравнению с традиционными исключениями в других языках, поскольку она требует явного объявления функций, которые могут выбрасывать ошибки (throws), и явной обработки этих ошибок при вызове (try, do-catch).