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

如何实现Async Let并发任务仅在全部失败时抛出错误?

Swift异步请求:仅双失败时才抛出错误的实现方案

你需要从两个不同数据源获取同类型数组,要求只有当两个请求同时失败时才抛出服务器错误,任一请求成功就返回拼接后的数组。原代码中使用async let结合try await会在单个请求失败时直接抛出错误,不符合需求;用try?会丢失错误信息,改用Result返回又不够简洁合理。

核心解决方案代码

func test() async throws -> [Any] {
    // 分别捕获两个请求的成功/失败结果,保留错误信息
    let result1 = await Result { try await getArr() }
    let result2 = await Result { try await getArr2() }
    
    // 收集所有成功返回的数组
    var combined = [Any]()
    if let arr1 = try? result1.get() {
        combined.append(contentsOf: arr1)
    }
    if let arr2 = try? result2.get() {
        combined.append(contentsOf: arr2)
    }
    
    // 仅当两个请求都失败时抛出错误
    switch (result1, result2) {
    case (.failure(let err1), .failure(let err2)):
        // 这里可以选择抛出其中一个错误,或者自定义复合错误包含两个错误
        throw err1
    default:
        return combined
    }
}

func getArr() async throws -> [Any] {
    // 替换为实际的异步请求逻辑
    []
}

func getArr2() async throws -> [Any] {
    // 替换为实际的异步请求逻辑
    []
}

代码说明

  • 用Result捕获单个请求结果:通过Result { try await 请求函数 }的方式,把每个异步请求的结果封装成Result类型,既不会中途抛错打断流程,又完整保留了错误信息。
  • 拼接成功数据:用try? result.get()安全提取成功的数组,将所有有效数据拼接起来。
  • 判断双失败场景:通过switch匹配两个结果都为失败的情况,此时抛出错误;其他情况直接返回拼接后的数组。

可选优化:保留双错误信息

如果需要同时记录两个请求的错误,可以自定义错误类型:

enum DualRequestError: Error {
    case bothFailed(firstError: Error, secondError: Error)
}

// 在test函数的switch分支中修改为:
case (.failure(let err1), .failure(let err2)):
    throw DualRequestError.bothFailed(firstError: err1, secondError: err2)

这样调用方捕获错误时,就能同时获取两个请求的错误详情。

内容的提问来源于stack exchange,提问作者Gargo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:20