Swift 2尝试/捕捉

时间:2015-08-20 23:43:50

标签: ios swift2 xcode7-beta5

我已经开始将我的一个项目转换为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 {

我收到此错误:

  

投掷'(_,_,_)类型的函数的转换无效 - >   Void'到非投掷函数类型'(NSData?,NSURLResponse?,   NSError?) - >无效“

我确实发现了:

} catch _ {

但是很有用,但是很有用。

我错过了什么或者我应该提交错误吗?

(这是Xcode 7b5)

1 个答案:

答案 0 :(得分:3)

dataTaskWithRequest的完成处理程序并非旨在抛出JSONObjectWithData NSJSONSerialization之类的错误,其签名为:

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")
}