我已经开始把我的一个项目转换成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 {我知道这个错误:
从类型'(_,_,_)的抛出函数到非抛函数类型的无效转换(NSData?,NSURLResponse?,NSError?) -> Void‘
我确实发现:
} catch _ {很管用,但对我有很大好处。
我是不是漏掉了什么东西,还是应该提交一个窃听器?
(这是Xcode 7b5)
发布于 2015-08-21 04:19:08
dataTaskWithRequest的完成处理程序不像JSONObjectWithData of 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")
}https://stackoverflow.com/questions/32130208
复制相似问题