从 dataTask completionHandler 抛出错误

Throw error from dataTask completionHandler

在 swift 中,我如何在这样的完成处理程序中抛出错误:

    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'

短篇小说:您不能 throwdataTask 完成闭包中

您可以 return 完成处理程序中的两个值

...completion: @escaping (ResultType?, Error?)->Void

和return

completion(result, nil)
completion(nil, CustomError.myerror)

或更方便地使用具有关联类型的枚举

enum Result {
    case success(ResultType), failure(Error)
}

...completion: @escaping (Result)->Void

和return

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
    }
}

更新:

在 Swift 5 中使用新的内置 Result 类型它更加舒适,因为 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()