2015-08-20 47 views
2

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

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 { 

我得到这个错误:

Invalid conversion from throwing function of type '(_, _, _) throws -> Void' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'

我也发现:

} catch _ { 

的作品,但对我来说很多好事。

我错过了什么,或者我应该提交一个错误?

(这是Xcode中7B5)

回答

3

dataTaskWithRequest完成处理的目的不是抛出错误像NSJSONSerializationJSONObjectWithData,它的签名是:

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

执行以下操作将工作(同什么你已经尝试过):

catch _ 

但是,这不会给我们任何关于从一个t帽子投掷,即从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") 
} 
+1

完美。除非我抛出自定义的ErrorType,否则我不会这么做。谢谢 !! – rjb101