从 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'
短篇小说:您不能 throw
在 dataTask
完成闭包中
您可以 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()
在 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'
短篇小说:您不能 throw
在 dataTask
完成闭包中
您可以 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()