Swift异步函数如何正确处理错误 解决decodedData不在作用域等报错
问题原因
你遇到的两个报错/警告都是基础语法规则导致的:
Cannot find 'decodedData' in scope错误:do是独立的代码块作用域,在块内部声明的常量/变量默认只能在块内部访问,你没有在作用域外部存储解析结果,自然无法获取到decodedData。Result of call to 'decode(_:from:)' is unused警告:decode方法执行后会返回解析完成的模型实例,你没有将返回值赋值给任何变量,相当于白执行了解析逻辑,编译器会抛出这个提醒。
正确实现逻辑
Swift 异步函数的错误处理有两种常用方案,你可以根据业务场景选择:
方案1:函数抛出错误,交给上层调用方处理
如果希望上层业务感知到错误并做定制化处理(比如弹出错误提示、降级逻辑),可以给函数加上 throws 关键字,将错误向上抛出:
// 函数签名加上 throws,代表调用时需要处理错误 func myFunc() async throws -> TransactionsClassAModel { // 不要用 ! 强制解包URL,先判断URL合法性 guard let url = URL(string: "...") else { // 自定义错误抛出 throw NSError(domain: "YourApp", code: -1, userInfo: [NSLocalizedDescriptionKey: "URL格式非法"]) } let undecodedData = try await networkingTools.afRequest(url: url) let decodedData = try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData) return decodedData } // 上层调用示例 func requestData() async { do { let model = try await myFunc() // 拿到解析完成的模型,处理业务逻辑 print("请求成功", model) } catch { // 统一处理所有错误 print("请求失败", error.localizedDescription) } }
方案2:函数内部消化所有错误,返回可选值/默认值
如果不想让上层感知错误,只需要在出错时返回空或者默认模型实例,可以将返回值修改为可选类型,在函数内部处理所有错误:
// 返回值修改为可选类型,出错时返回nil func myFunc() async -> TransactionsClassAModel? { guard let url = URL(string: "...") else { print("URL格式错误") return nil } do { let undecodedData = try await networkingTools.afRequest(url: url) let decodedData = try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData) // 解析成功直接在do块内返回,规避作用域问题 return decodedData } catch { print("错误:", error) // 出错返回nil,也可以返回你预先定义的默认模型实例 return nil } }
注意:不要在生产环境使用
try!强制解析,只要网络请求或者JSON解析出现任何问题,try!会直接触发App崩溃。
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

