You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift异步函数如何正确处理错误 解决decodedData不在作用域等报错

问题原因

你遇到的两个报错/警告都是基础语法规则导致的:

  1. Cannot find 'decodedData' in scope 错误:do 是独立的代码块作用域,在块内部声明的常量/变量默认只能在块内部访问,你没有在作用域外部存储解析结果,自然无法获取到 decodedData。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:36:03