Swift开发中如何在catch块识别JSONSerialization抛出的具体错误类型
捕获
JSONSerialization.jsonObject具体错误的实现方法 可以直接改造现有do-catch块,利用Swift强类型错误匹配能力拿到具体错误类型,不需要依赖笼统的错误打印:
- 按错误类型拆分catch分支,优先匹配JSON解析专属的强类型枚举
JSONError,剩余其他可抛出错误统一兜底:
do { // 强制解包`data!`、强制`as!`类型转换的失败属于运行时直接崩溃,无法被do-catch捕获,建议提前做可选绑定规避 guard let validData = data else { print("输入数据为空,无法执行JSON解析") return } let jsonObject = try JSONSerialization.jsonObject(with: validData) guard let jsonDict = jsonObject as? [String: AnyObject] else { print("解析得到的JSON根节点类型不是字典") return } print(jsonDict) } catch let parseError as JSONError { // 精准命中所有JSON解析环节抛出的枚举类错误 switch parseError { case .cancelled: print("JSON解析任务被主动取消") case .unsupported: print("当前输入数据格式不支持JSON序列化") case .dataCorrupted(let context): print("JSON数据内容损坏,具体原因:\(context.debugDescription)") @unknown default: print("当前系统版本未定义的JSON解析错误:\(parseError)") } } catch { // 兜底捕获其他不属于JSONError体系的可抛出错误 print("其他可捕获错误:\(error),系统描述:\(error.localizedDescription)") }
补充说明:Swift 5及以上版本中,所有Foundation框架下的JSON解析相关方法(包括JSONSerialization、JSONDecoder)抛出的解析类错误,都统一使用JSONError枚举承载,旧版本框架中零散的NSError格式错误已经逐步替换为这种强类型枚举形式,不需要手动通过domain和错误码判断错误类型。
查询指定方法/对象所有可抛出错误类型的可行途径
在官方文档未明确列全错误枚举的场景下,可以通过以下方式拿到完整的错误清单:
- 依靠编译器的类型匹配校验:在catch块中编写目标错误类型的匹配分支,只要该类型的错误是目标方法可能抛出的,编译就会正常通过;如果方法根本不会抛出这个类型的错误,Xcode会直接给出“无法匹配该类型错误”的编译警告,快速帮你筛选出和当前方法关联的错误类型。
- 查看Xcode内置的API定义注释:按住Command键点击
JSONSerialization.jsonObject的方法名,会直接跳转到Xcode内置的接口定义页,方法上方的文档注释中,throws:段落会直接列明所有该方法抛出的强类型错误;对于旧版API,注释中会标注对应的NSError域和关联的错误码枚举,无需跳转外部网页查询。 - 使用Xcode的错误抛出断点:在Xcode断点导航栏添加一个“Swift Error Breakpoint”,触发错误的时候调试控制台会直接打印当前抛出错误的完整类型、错误码、上下文信息,不需要额外编写catch逻辑就能拿到所有可能的错误类型样本。
注意:强制解包可选值、强制类型转换(
as!)触发的失败属于运行时直接崩溃,不属于Swift Error可抛出、可被do-catch捕获的范畴,这类问题需要提前做可选绑定和类型检查规避,无法通过catch块兜底。
内容的提问来源于stack exchange,提问作者bobobobo
相关产品推荐
相关产品推荐

