try await и распространение ошибок
Используйте try await с асинхронными функциями, которые могут завершаться ошибкой, обрабатывайте сбои с помощью do/catch и корректно передавайте ошибки выше, включая CancellationError .
«try await и распространение ошибок» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.
Зачем нужны try await?
try await вызывает асинхронную функцию, выбрасывающую ошибки. Если она выбрасывает ошибку, ошибка передаётся дальше, если только Вы не перехватите её. Можно также использовать try?, чтобы преобразовать результат в Optional.
Асинхронная функция с ошибками и do/catch
Создайте асинхронную функцию, выбрасывающую ошибки, и вызовите её с помощью try await внутри do/catch, чтобы обработать сбои.
enum NetError: Error { case offline; case badStatus(Int) }
func fetchNumber(from ok: Bool) async throws -> Int {
try await Task.sleep(nanoseconds: 100_000_000)
if !ok { throw NetError.offline }
return 7
}
Task {
do {
let n = try await fetchNumber(from: true)
print("value:", n) // 7
} catch {
print("failed:", error) // handled here
}
}Преобразование ошибок
Используйте try?, чтобы получить Optional вместо выброса ошибки. Избегайте try!, если только Вы не уверены, что сбой невозможен.
Task {
// try? converts failure to nil
let maybe = try? await fetchNumber(from: false)
print("optional result:", String(describing: maybe)) // nil on error
// ⚠️ try! will crash if an error is thrown — avoid in production
// let forced = try! await fetchNumber(from: false)
}Передача ошибок наверх
Помечайте вызывающие функции как async throws, чтобы передавать ошибки выше; их можно обработать на более высоком уровне.
func loadProfile(ok: Bool) async throws -> String {
let id = try await fetchNumber(from: ok) // propagate on error
return "id:\\(id)"
}
Task {
do {
let s = try await loadProfile(ok: true)
print(s) // "id:7"
} catch {
print("propagated:", error)
}
}Точечная обработка ошибок
Используйте блоки catch с сопоставлением с образцом. Сначала обрабатывайте CancellationError, чтобы пути завершения оставались быстрыми и не создавали лишнего шума.
enum FileError: Error { case notFound }
func mightCancel() async throws {
for _ in 0..<5 {
try Task.checkCancellation() // throws CancellationError
try await Task.sleep(nanoseconds: 30_000_000)
}
}
Task {
let t = Task { try await mightCancel() }
t.cancel()
do {
try await t.value
} catch is CancellationError {
print("cancelled cleanly") // handle cancellation separately
} catch {
print("other error:", error)
}
}Рекомендации
Советы:
- Передавайте ошибки дальше с помощью try до границы, которая может принять решение: пользовательского интерфейса, CLI или задачи верхнего уровня.
- Для ясности предпочитайте ошибки предметной области, представленные перечислениями.
- Преобразуйте ошибки с помощью try? только тогда, когда допустимо отсутствие значения.
- Отдельно обрабатывайте CancellationError.
Обработка ошибок с помощью try await
Быстрая проверка: что происходит с ошибками при вызове try await f()?
Итоги
Итоги: используйте try await с асинхронными функциями, выбрасывающими ошибки, передавайте ошибки наверх из вспомогательных функций, преобразуйте их с помощью try?, когда допустимо необязательное значение, и явно обрабатывайте CancellationError.
Часто задаваемые вопросы
Урок «try await и распространение ошибок» бесплатный?
Да — полный текст урока «try await и распространение ошибок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.
Чему я научусь в уроке «try await и распространение ошибок»?
Используйте try await с асинхронными функциями, которые могут завершаться ошибкой, обрабатывайте сбои с помощью do/catch и корректно передавайте ошибки выше, включая CancellationError . Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «try await и распространение ошибок»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Структурированный параллелизм и асинхронные функции
- async let, Task и отмена
- try await и распространение ошибок