繁体   English   中英

在闭包内部try-catch->从抛出到非抛出函数类型的无效转换

[英]try-catch inside closure -> Invalid conversion from throwing to non-throwing function type

我已经用throws标记了我的函数,为什么会迅速迫使我使用do-try-catch块?

我想处理在以下我称之为此函数的地方引发的任何类型的错误。

static func getPosts() throws {

    let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1")
    let request = URLRequest(url: url!)

    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in

        let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableLeaves) as! [String: Any]  

    }.resume()        
}

以下是我遇到的错误的屏幕截图。

throws表明您的getPosts()函数本身将抛出throws 但是,它在调用闭包之前完成了,这意味着即使json解析引发异常,您也已经花费了可以捕获和处理异常的时间。

闭合中的错误必须在闭合中处理。 您正在寻找类似的东西

static func getPosts(completion: @escaping (_ error: String) -> Void) {

    let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1")
    let request = URLRequest(url: url!)

    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableLeaves) as! [String: Any]
            completion("ok")
        }catch let error {
            print(error)
            completion("error")
        }

    }.resume()        
}

从闭包内部捕获错误是不可能的。

合适的解决方案是枚举和完成处理程序

enum PostResult {
    case success([String:Any]), failure(Error)
}

func getPosts(completion:@escaping (PostResult)->() ) {

    let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1")!
    // no URLRequest needed !
    let session = URLSession.shared
    session.dataTask(with: url) { (data, response, error) in
        if let error = error { 
            completion(.failure(error)) 
            return
        }
        do {
            let json = try JSONSerialization.jsonObject(with: data!) as! [String: Any]
            completion(.success(json))
        } catch {
            completion(.failure(error))
        }

    }.resume()
}

并使用它

getPosts { result in
    switch result {
    case .success(let json): print(json)
         // process json 
    case .failure(let error): print(error)
         // handle error
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Alamofire 4从投掷类型&#39;(_)throws - &gt;()&#39;到非投掷函数类型&#39;的转换无效(DataResponse <Any> ) - &gt; Void&#39; 从类型为((Data)-throw(-)(throws)的抛出函数到无效类型为((Data)-&gt;()&#39;&#39;的非抛出函数的无效转换 从类型为((_,_,_)的throwing函数-&gt;()到无效类型为&#39;(URLResponse ?, Data ?, Error?)-&gt; Void的无效转换 从投掷函数类型(_,_,_)到非投掷函数类型(Data?,Response?,URLResponse?)的无效转换 从“(_, _) throws -&gt; ()”类型的抛出函数到非抛出函数类型“(JSON?, Error?) -&gt; Void”的无效转换 从“(_) throws -&gt; ()”类型的抛出 function 到非抛出 function 类型“(Response) -&gt; Void”的无效转换 错误:从类型为((_)的throwing函数-&gt;()&#39;到非类型为&#39;(DataSnapshot)-&gt; Void&#39;的非抛出函数的无效转换 从类型为((_)的throwing函数-&gt; Void&#39;无效转换为类型为非抛出函数&#39;([[UNNotificationRequest])-&gt; Void 错误迁移到Swift 2:从类型的抛出函数到非抛出函数类型的转换无效以及使用了未声明的类型 从 (_,_,_) 类型的抛出函数 throws -&gt; Void 到非抛出函数类型 (NSData?, NSURLResponse?, NSError?) 的无效转换 -&gt; Void
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM