Ответ
Ключевое слово throws в Swift указывает, что функция или метод может выбросить ошибку во время выполнения. Оно используется для обработки исключительных ситуаций, когда операция может завершиться неудачно (например, сетевая ошибка, парсинг данных).
Основные принципы:
- Функция с
throwsобъявляет, что она может выбросить ошибку. - Вызывающий код обязан обработать возможную ошибку с помощью
do-try-catch,try?илиtry!. - Выбрасываемые ошибки должны соответствовать протоколу
Error.
Пример объявления и вызова:
// 1. Определение ошибки
enum NetworkError: Error {
case invalidURL
case requestFailed(statusCode: Int)
}
// 2. Функция, которая может выбросить ошибку
func fetchData(from urlString: String) throws -> Data {
guard let url = URL(string: urlString) else {
throw NetworkError.invalidURL
}
// ... выполнение запроса
let (data, response) = try await URLSession.shared.data(from: url)
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
throw NetworkError.requestFailed(statusCode: (response as? HTTPURLResponse)?.statusCode ?? 0)
}
return data
}
// 3. Обработка ошибки при вызове
func loadUserData() {
do {
let data = try fetchData(from: "https://api.example.com/user")
// Обработка успешного результата
parse(data)
} catch NetworkError.invalidURL {
print("Ошибка: неверный URL.")
} catch NetworkError.requestFailed(let code) {
print("Ошибка сети с кодом: (code).")
} catch {
print("Неизвестная ошибка: (error).")
}
}
Альтернативные способы вызова:
try?— преобразует результат в опционал. При ошибке возвращаетnil.if let data = try? fetchData(from: urlString) { /* успех */ }try!— принудительное извлечение. Вызовет краш при ошибке. Используйте только когда уверены, что ошибки не произойдет.let data = try! fetchData(from: guaranteedValidURL) // Рискованно
Использование throws делает поток ошибок явным и проверяемым компилятором, что повышает надежность кода.