我如何快速地在这样的完成处理程序中抛出错误:
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
do {
//something
completion(result)
} catch let jsonError {
throw CustomError.myerror //THIS DOESN'T WORK
}
})
task.resume()
因为错误是
Invalid conversion from throwing function of type '(_, _, _) throws -> ()' to non-throwing function type '(Data?, URLResponse?, Error?) -> Void'
最佳答案
短篇小说:你不能throw
dataTask
completion closure
您可以在完成处理程序中返回两个值
...completion: @escaping (ResultType?, Error?)->Void
返回
completion(result, nil)
completion(nil, CustomError.myerror)
或更方便地使用具有关联类型的枚举
enum Result {
case success(ResultType), failure(Error)
}
...completion: @escaping (Result)->Void
返回
completion(.success(result))
completion(.failure(CustomError.myerror))
你可以处理结果
foo() { result in
switch result {
case .success(let resultType): // do something with the result
case .failure(let error): // Handle the error
}
}
更新:
在使用新的内置 Result
类型的 Swift 5 中,它更加舒适,因为 Result
可以捕获抛出表达式的结果
...completion: @escaping (Result<MyType,Error>)->Void
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
completion(Result { try something()})
})
task.resume()
更新 2:
async/await
完成处理程序消失了
do {
let (data, response) = try await URLSession.shared.data(for: request)
} catch {
throw CustomError.myerror
}
关于swift - 从 dataTask completionHandler 抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51242762/