通过一段代码来了解数据的错误处理:
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()
}
}
网友评论