异步操作抛出异常时,如何获取另一异步方法的执行结果?
实现方案
核心思路是优先调用SQL仓库的查询方法,当该方法抛出异常或返回空数据时,自动降级到Mongo仓库获取结果并返回。以下是调整后的代码实现:
public async Task<IEnumerable<User>> GetUsersAsync(int departmentId, CancellationToken token) { try { // 优先调用SQL仓库的查询方法(Method 1) var usersFromSqlDb = await _userSqlRepository.GetUsersAsync(departmentId, token); // 如果SQL返回非空数据,直接返回结果 if (usersFromSqlDb.Any()) { return usersFromSqlDb; } } catch (Exception ex) { // 捕获SQL调用的所有异常(如数据库连接失败),不抛出异常 // 建议在此处添加日志记录,便于排查问题 // _logger.LogError(ex, "从SQL仓库获取用户失败,将尝试从Mongo仓库获取"); } // 两种场景会走到这里:SQL返回空数据,或SQL调用抛出异常 // 调用Mongo仓库的查询方法(Method 2)并返回结果 return await _userMongoRepository.GetUsersAsync(departmentId, token); }
关键细节说明
- 异常处理:捕获SQL方法的所有异常,确保任何SQL端的问题都能触发降级逻辑;如果需要对特定异常(如业务自定义的
CannotAnyUserException)保留抛出行为,可以单独捕获该异常并重新抛出:catch (CannotAnyUserException) { // 这类业务异常直接抛出,不触发降级 throw; } catch (Exception ex) { // 其他异常触发降级到Mongo } - 空值处理:SQL返回空集合时,自动切换到Mongo查询,符合需求中"第一个方法无异常但返回空则用第二个方法结果"的要求
- 取消令牌传递:确保
CancellationToken传递到所有异步方法,保证取消信号能正确终止所有异步操作
内容的提问来源于stack exchange,提问作者Yuriy Dx
相关产品推荐
相关产品推荐

