我想在完成处理程序中捕获错误,以便调用者可以捕获它们。我有以下代码:
private func data_request(url : String, params : String, regularRequest : Bool, completionHandler: @escaping (_ json: Any) -> ()){
let buildUrl = BuildUrl().createUrl(url: url, regularRequest: regularRequest);
if(buildUrl.1){
print("There is something wrong with creating the url");
}
let url:NSURL = NSURL(string: buildUrl.0)!
let session = URLSession.shared
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "POST"
request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
let paramString = (params != "") ? params : ""
request.httpBody = paramString.data(using: String.Encoding.utf8)
let task = session.dataTask(with: request as URLRequest) {
(data, response, error) in
if data == nil {
print("dataTaskWithRequest error: \(error)")
return
} else {
do {
let json = try JSONSerialization.jsonObject(with: data!, options: [])
completionHandler(json)
} catch {
if let data = data,
let html = String(data: data, encoding: String.Encoding.utf8) {
print(html)
}
print("error serializing JSON: \(error)")
}
}
}
task.resume()
}
它返回 json,但是否可能抛出错误?例如当数据== nil时,抛出错误并在调用方捕获它?
调用方:
func insertData(roomName : String, completionHandler: @escaping (_ error : Bool, _ message : String) -> ()) {
do {
let params = "name=/(roomName)";
data_request(url: createAndJoinRoom, params: params,regularRequest: true) { json in
completionHandler(error, message)
};
} catch {
}
}
实际调用者:
ApiManager().insertData(roomName: "test") { (Bool, String) in
}
我想在我的“实际调用者”处使用一个 catch block 或其他构造并在那里处理错误。我的想法是修改 insertData 方法中的所有错误,这样我就可以用不同的错误消息捕获一个错误。
我该如何实现?
最佳答案
您不能将 throw
与完成处理程序一起使用。
另一种方法是使用具有关联类型的枚举
enum Result {
case success, failure(Error)
}
或者更通用,能够传递不同但不同的返回类型
enum Result<T> {
case success(T), failure(Error)
}
然后您可以在完成处理程序中传递一个类型
... completionHandler: @escaping (Result) -> ()) { ...
并处理返回值
... { result in
switch result {
case .success : print("success")
case .failure(let error) : print(error)
}
}
这是一种非常方便高效的方式
关于swift - 在关闭时捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43010136/