swift - 在关闭时捕获错误

标签 swift

我想在完成处理程序中捕获错误,以便调用者可以捕获它们。我有以下代码:

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/

相关文章:

swift - 是否可以创建一个模仿 CKRecord 的类?

ios - 如何使用 Sqlite.swift 获取列名列表?

swift - 添加新窗口并使其成为 SWIFTUI 中的关键窗口

ios - 变换后调整 View 大小以适合 super View

ios - 使用 SwiftyJSON 的 NSDictionary 到 json 字符串到 json 对象

javascript - 通过 socket.io Swift 客户端在 iOS 中使用 Socket.io

ios - 如何删除 Swift 闭包中设置的通知观察者?

sqlite - 找不到接受 'contains' 类型的参数列表的 '([Int], Expression<String>)' 重载

asynchronous - 从异步函数重新加载 UITable 调用

ios - 如何让我的 Image 填满整个 ScrollView?