【问题标题】:Swift 2 try/catch斯威夫特 2 尝试/捕捉
【发布时间】:2015-08-20 23:43:50
【问题描述】:

我已经开始将我的一个项目转换为 Swift 2 并且遇到了这个问题。下面开始这个块是完全有效的try/catch,实际上它是由Xcode迁移工具生成的。

do {
       requestData = try NSJSONSerialization.dataWithJSONObject(requestContents, options: [])
} catch var error as NSError {
      requestError = error
      requestData = nil
}

如果我在闭包中使用相同的代码,例如 dataTaskWithRequest,我会收到错误消息。错误在于任务分配,但它是导致它的问题。以下也有效,但我没有捕捉到错误。

let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, taskError) -> Void in
    if taskError != nil {
        NSLog("Error making request: " + taskError!.localizedDescription)
    } 
    else {
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary
            if let parseJSON = json as NSDictionary? {
                // do some parsing here
            }
        } 
        catch {
           NSLog("Error in JSON serialization")
     }
  }
})
task.resume()

但如果我尝试通过以下方式捕获错误:

} catch let e as NSError {

我收到此错误:

'(_, _, _) throws 类型的抛出函数的无效转换 -> 无效'到非抛出函数类型'(NSData?,NSURLResponse?, NSError?)-> 无效'

我确实发现了:

} catch _ {

有效,但对我有很多好处。

我是遗漏了什么还是应该提交错误?

(这是 Xcode 7b5)

【问题讨论】:

    标签: ios swift swift2 xcode7-beta5


    【解决方案1】:

    dataTaskWithRequest 的完成处理程序并非像NSJSONSerializationJSONObjectWithData 那样抛出错误,其签名为:

    class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject
    

    执行以下操作会起作用(与您尝试过的相同):

    catch _
    

    但这不会为我们提供任何关于抛出错误的详细信息,即来自class func JSONObjectWithData

    因此,我们需要一种方法来消耗不可投掷的 dataTaskWithRequest,同时保留可投掷的 JSONObjectWithData

    我尝试了以下方法:

    catch let error as NSError
    {
         //error specific to JSON serialization
         NSLog("Error in JSON serialization \(error)")
    }
    catch
    {
         //exhaust the error
         NSLog("Some error")
    }
    

    【讨论】:

    • 完美。除非我抛出自定义 ErrorType,否则我不会想到这样做。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2017-02-15
    • 2017-07-22
    • 1970-01-01
    • 2016-02-08
    • 2017-11-13
    • 2015-08-19
    相关资源
    最近更新 更多