如何实现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
相关产品推荐
相关产品推荐

