美文网首页iOS
Swift中数据的错误处理-三种try的使用

Swift中数据的错误处理-三种try的使用

作者: 下班不写程序 | 来源:发表于2019-10-08 19:49 被阅读0次

通过一段代码来了解数据的错误处理:

import UIKit

/* 知识点:
 从对象 到 二进制数据的过程 一般称为对象的序列化(Serialization),也称为归档(Archive).
 同理,从二进制数据 到 对象的过程 一般称为反序列化或者反归档.
 */
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        loadData()
    }
    
    // 请求数据
    func loadData(){//
        // 请求的url (实测: 返回结果为json)
        let url = URL(string: "http://www.weather.com.cn/data/sk/101010100.html")
//        let url = URL(string: "http://www.baidu.com")
        
        // guard判断url 是否为nil
        guard let u = url else {
            return
        }
        
        // 实例化request
        let request = URLRequest(url: u)
        
        // 发送请求
        URLSession.shared.dataTask(with: request) { (data, _, error) in
            
            // 错误判断
            if error != nil {
                print(error!)
                return
            }
            
            // 判断data 是否有值
            guard let d = data else{
                return
            }

            // 出现问题: 正常情况下, 将Json 反序列化为字典, 但是正常写了会报错
            // 报错内容: Call can throw, but it is not marked with 'try' and the error is not handled
            // 报错原因: 调用可能够抛出异常, 因为没有标记try, 也未作错误处理. 系统处理的一种方式而已.
            // 解决方法: 既然说了没有标记try, 那就标记即可.
//            let dict = JSONSerialization.jsonObject(with: d, options: [])
            
            // 解决方式一: 强行try (try!)
            // 存在问题: 当请求结果不是标准的json数据时, 会造成程序崩溃
            // 也就是说: url为天气的链接时, 就会正常使用; 而url为百度的链接时, 就会崩溃.
//            let dict = try! JSONSerialization.jsonObject(with: d, options: [])
            
            
            // 解决方式二: 可选try (try?)
            // 特点: 能反序列化成功, 就给你返回成功的值; 不能成功就给你返回nil
//            let dict = try? JSONSerialization.jsonObject(with: d, options: [])
            
            // 打印结果
//            print(dict)
            
            // 解决方式三: 默认try (try)
            // 注意: 一定要配合 do{}catch{} 使用
            do{
                let dict = try JSONSerialization.jsonObject(with: d, options: [])
                print(dict)
            }catch{
                // catch 中默认提供error信息, 当序列化不成功是, 返回error
                print(error)
            }
        }.resume()
    }
}

相关文章

网友评论

    本文标题:Swift中数据的错误处理-三种try的使用

    本文链接:https://www.haomeiwen.com/subject/neyauctx.html