【问题标题】:NSJSONSerialization Error : Why am I not able to catch the error in try catch block? swift 3.0NSJSONSerialization 错误:为什么我无法在 try catch 块中捕获错误?迅捷3.0
【发布时间】:2017-06-22 10:19:13
【问题描述】:

我正在调用 REST API 以从服务器获取响应,并且还测试了错误的数据类型以捕获在 try catch block nut 应用程序中仍然崩溃并出现以下错误:

无法将“__NSArrayM”(0x10575ee00) 类型的值转换为“NSDictionary”(0x10575f2d8)。

    let dataTask = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print(error!)
            return
        }

        do {

           let responseObject = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary<String,String>

            print(responseObject)

        } catch let jsonError {

            print(jsonError)
        }
    }
    dataTask.resume()

为此,我也找到了先用 JSON 格式检查数据,然后使用 JSONSerialization 的解决方案。

if JSONSerialization.isValidJSONObject(data){
    responseObject = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary<String,String>

}
else {

    print("Error")

} 

我想知道如果类型转换值错误没有被 try-catch 块捕获,那么 try-catch 块在网络调用中的用途是什么。我可以简单地检查 @987654323 @ 格式并传递响应对象。

什么是好的编程习惯?

注意:错误不是问题,我只是不希望我的应用程序在数据类型从字典更改为数组或非指定类型时崩溃。

【问题讨论】:

    标签: ios iphone swift swift3


    【解决方案1】:

    这与有效的JSON 无关,您遇到此崩溃是因为您的JSON 在根目录下是Array 而不是Dictionary 并且您正试图将jsonObject(with:) 的结果转换为Dictionary您遇到此崩溃的原因也无需使用 Swift 指定 mutableContainers

    do {
    
        let responseObject = try JSONSerialization.jsonObject(with: data, options: []) as! [[String:Any]]
        print(responseObject)
    
    } catch let jsonError {
    
        print(jsonError)
    }
    

    编辑:如果您不知道您的JSON 时间,那么您可以使用 if let like 这样的方式。

    do {
    
        let responseObject = try JSONSerialization.jsonObject(with: data, options: [])
        if let responseArray = responseObject as? [[String:Any]] {
            //Access array
        }
        else if let responseDictionary = responseObject as? [String:Any] {
            //Access dictionary
        }
        print(responseObject)
    
    } catch let jsonError {
    
        print(jsonError)
    }
    

    【讨论】:

    • 那么它应该在 try catch 块中捕获但应用程序崩溃
    • @SiddheshMhatre 你能告诉我们它在哪一行崩溃,你还需要向我们展示你的JSON回复
    • 错误不是问题,我只是不希望我的应用程序在数据类型从字典更改为数组或非指定类型时崩溃。
    • @SiddheshMhatre 转换失败不是例外,它是导致中止的运行时错误。没有办法抓住它或恢复。这就是使用as! 而不是as? 的危险。如果要检测问题,则必须使用as?
    • @NiravD 我知道它会起作用,但是 try-catch 块的用途是什么。我想在数据类型从指定类型更改时捕获错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2016-05-29
    • 2018-12-05
    • 2021-07-25
    • 1970-01-01
    • 2019-01-12
    • 2023-01-14
    相关资源
    最近更新 更多