[swift]Try 块不能正常工作

标签: ios Swift
发布时间: 2017/3/6 23:24:18
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我正在进行一个通过 NSURLSession 调用 api 的应用程序。Api 正常工作时没问题但接收到没有数据时由于任何错误然后在序列化之后,它将引发错误但 else 块为它永远不会调用

 let task = session.dataTaskWithRequest(request) { (let data, let response,  let error) in


        do {
            guard let data:NSData = data , let response: NSURLResponse = response where error == nil else {
                throw error!
            }

            guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else{
                print("Serialization failed") //This block never executes even if the Serialization Fails
                throw JSONError.ConversionFailed

            }

            guard json.valueForKey("success") != nil else {
                return
            }


            self.apidata = json
            dispatch_async(dispatch_get_main_queue()){
                self.tableView.reloadData()
            }
            print(json.valueForKey("success")!)

        }
        catch let error as JSONError{
            self.showalertview(error.rawValue)
            print(error.rawValue)
        } catch let error as NSError{


            print(error.debugDescription)
        }
    }

    task.resume()

我在做什么在这里错了???

解决方法 1:

考虑︰

do {
    guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
        // A
    }
} catch {
    // B
}

如果 NSJSONSerialization 引发一个错误 (即如果 JSON 响应或响应是否格式不正确,那其实不是),它将请直接转到 Bguard 语句不会发挥作用。guard将只执行语句 A 当且仅当 (a) NSJSONSerialization 调用,本身,并没有引发任何错误 (即 JSON 是格式良好的); 但 (b) 强制转换为字典失败 (例如顶级 JSON 对象是数组而不是一本字典)。这是一个极不可能发生的场景 (您的服务器将不得不意外地返回并不是一本字典,例如 JSON 数组格式的 JSON 响应)。


要完成你想要什么,你可以使用 try? 来确保 NSJSONSerialization 不会抛出任何错误,本身︰

do {
    guard let json = try? NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
        // A
        throw JSONError.ConversionFailed 
    }
} catch {
    // B
}

通过这样做,只是如果 A 执行 throwB 被称为

官方微信
官方QQ群
31647020