尝试阻止无法正常工作

时间:2016-07-29 06:30:38

标签: ios swift try-catch

我正在开发一个应用程序,其中通过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 个答案:

答案 0 :(得分:1)

考虑:

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

如果NSJSONSerialization抛出错误(即,如果它不是真正的JSON响应或响应格式错误),它将直接进入B并且guard语句不会不会发挥作用。 guard语句只会执行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执行throw B时才会被调用

相关问题