迅速尝试抓不工作

时间:2016-08-10 02:01:50

标签: swift nsjsonserialization

我正在尝试做,尝试,抓住这样:

do {
   setQA = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [AnyObject]
   print(setQA)
}
catch _ {
    setQA = nil
    self.customAlert("Error")
}

我试图调用一个方法来使用UIAlertController,但它永远不会到达它。

这甚至没有通过尝试,我的应用程序崩溃与此错误:

Could not cast value of type '__NSCFDictionary' (0x1a1773968) to 'NSArray'

这是一个预期的错误,有时会发生在用户数据上,我只是不让我的应用程序崩溃并只显示警报

2 个答案:

答案 0 :(得分:1)

do/try/catch将捕获其他方法抛出的错误,但它不会捕获运行时异常,例如您从强制转发中获取。例如,如果data是无效的JSON,则会抛出并捕获错误。在你的情况下,似乎JSON是有效的,但它是一个字典,而不是一个数组。

你想要像

这样的东西
setQA = nil
do {
    if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as? [AnyObject] {
        setQA = json
        print(setQA)
    } else {
        self.customAlert("Invalid response from server")
    }
} catch _ {
    self.customAlert("Error parsing JSON")
}

答案 1 :(得分:1)

实际上这来自你的代码的这一部分:

JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! [AnyObject]

你能做的就是这样:

  1. 首先检查您是否确实从服务器接收了一些数据:
  2. 检查这些数据的格式。您的代码崩溃了,因为它试图将您的JSON解析为错误的格式(这里是一个对象数组),所以尽量覆盖所有可能的情况。
  3. 结果代码将是这样的:

        if let realData = data as? Data{
    
                 do {
                        if let setQA = try NSJSONSerialization.JSONObjectWithData( realData, options: NSJSONReadingOptions.AllowFragments) as? [AnyObject] {
                            //Check if the result is an Array
                        print(setQA)
                        }else if setQA = try NSJSONSerialization.JSONObjectWithData( realData, options: NSJSONReadingOptions.AllowFragments) as? [String : AnyObject] {
                            //Check if the result is a dictionnary
                        }
                    }
                    catch _ {
                        setQA = nil
                        self.customAlert("Error")
                    }
    
                }else{
                    //Check if you have at least some data
                    self.customAlert("No data from server :(")
                }
    }
    

    一般情况下,尽量避免使用! ;)