#swift
#быстрый
Вопрос:
Я ничего не могу найти в документах, как определяется следующее поведение
// task-less context
Task.detached {
try await myThrowingFunction()
runWhenSuccessful()
}
Метод возвращается в строке ввода и отбрасывает ошибку и runWhenSuccessful()
никогда не вызывается. Хотя в некотором роде это имеет смысл, я, по крайней мере, ожидал, что это вызовет сбой утверждения или что-то в этом роде для необработанной ошибки.
Каков правильный способ справиться с этим, поскольку я не могу обрабатывать ошибки ни в одной родительской задаче.
Должен ли я каждый раз оборачивать все в закрытие do/catch
?
Ответ №1:
Мне кажется, что по замыслу задача ожидает, что вы будете иметь дело с ошибкой внутри блока с помощью do/catch
, и если вы этого не сделаете, ошибка будет отброшена.
У задач есть result
свойство, которое вы можете прочитать после завершения задачи, но оно заблокирует текущий поток, так что, вероятно, это не то, что вы хотите.
Если вы часто используете этот шаблон, вы можете создать удобный инициализатор, для Task
которого требуется закрытие сбоя.
Вот как будет выглядеть пользовательский инициализатор и как он будет использоваться:
extension Task where Failure == Never, Success == Void {
init(priority: TaskPriority? = nil, operation: @escaping () async throws -> Void, `catch`: @escaping (Error) -> Void) {
self.init(priority: priority) {
do {
_ = try await operation()
} catch {
`catch`(error)
}
}
}
}
Task {
try await asyncTask()
} catch: { error in
handle(error)
}
Комментарии:
1. Да, просто кажется, что Apple должна была предоставить 2-е конечное закрытие по умолчанию для этого, вместо этого странного поведения.