提问者:小点点

将异常消息从服务传播到控制器.NET


我有一个.NET应用程序,其中有一个用于接收用户请求的控制器,一个服务服务1调用另一个服务服务2。我在Service 2中有一些代码,当用户请求值不正确时,我查询数据库(DynamoDB)并得到500错误的响应。我想处理这个问题,这样我就可以捕捉到这个错误/异常,并将错误消息连同一个400状态码一起从控制器发回给用户。我应该如何修改代码来做到这一点?

这是我尝试过的。目前,我只是在service1中打印错误,但我需要将其发送到控制器。通过抛出异常向控制器发送错误消息是正确的方法吗?

下面的代码与实际代码类似

控制器:

    [HttpGet]
    [Authorize(Policy = "Read-Entity")]
    [Route("byParams/{param1}/{param2}")]
    [Produces(typeof(DynamoResult<EntityResponse>))]
    public async Task<IActionResult> ListByParams([FromQuery] DynamoQuery entityQuery)
    {
        try
        {
            return await HandleRequest(async () =>
            {
                return Ok((await _entityStore.ListByParams(entityQuery)));
            });
        }
        catch (Exception e)
        {
            return BadRequest(e.Message);
        }
    }

服务1:

public async Task<DynamoResult<EntityResponse>> ListByParams(DynamoQuery entityQuery)
{            
    results = new DynamoResult<Entity>();
    try {
        results = await GetPagedQueryResults(entityQuery);
    }
    catch (Exception e) {
        Console.WriteLine(e);             
    }
    return new DynamoResult<EntityResponse>
    {
        Data = results.Data.Select(_mapper.Map<EntityResponse>).ToList(),                
    };        
}

服务2:

private async Task<DynamoResult<TResponse>> GetPagedQueryResults(DynamoQuery query)
{
    var results = new List<Document>();
    try{
        results = await search.GetNextSetAsync();
    }        
    catch(Exception e){
        throw new PaginationTokenException(e.Message);
    }
    return results;
}

[Serializable]
public class PaginationTokenException : Exception
{
    public PaginationTokenException() { }

    public PaginationTokenException(string message)
        : base(message) { 
            throw new Exception(message);
        }

    public PaginationTokenException(string message, Exception inner)
        : base(message, inner) { }
}

共1个答案

匿名用户

假设您想要对控制器隐藏实现细节(即,您不想让控制器知道/关心它是DynamoDB),我将创建一个自定义异常,并从service1中抛出该异常。

Service1的外观如下所示:

public async Task<DynamoResult<EntityResponse>> ListByParams(DynamoQuery entityQuery)
{            
    results = new DynamoResult<Entity>();
    try {
        results = await GetPagedQueryResults(entityQuery);
    }
    catch (Exception e) {
        throw new MyCustomException('My error message', e);             
    }
    return new DynamoResult<EntityResponse>
    {
        Data = results.Data.Select(_mapper.Map<EntityResponse>).ToList(),                
    };        
}

然后可以在控制器中显式捕获该异常:

    [HttpGet]
    [Authorize(Policy = "Read-Entity")]
    [Route("byParams/{param1}/{param2}")]
    [Produces(typeof(DynamoResult<EntityResponse>))]
    public async Task<IActionResult> ListByParams([FromQuery] DynamoQuery entityQuery)
    {
        try
        {
            return await HandleRequest(async () =>
            {
                return Ok((await _entityStore.ListByParams(entityQuery)));
            });
        }
        catch (MyCustomException e)
        {
            return BadRequest(e.Message);
        }
    }