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

异步操作抛出异常时,如何获取另一异步方法的执行结果?

实现方案

核心思路是优先调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:00:50