如何冒出异常

时间:2019-05-07 20:52:11

标签: c# exception asp.net-core model-view-controller

在我的MVC应用程序中,我有一个简单的场景:控制器调用业务层,其角色只是调用api。业务服务的代码如下:

public class ApiCaller : IApiCaller
{
    public async Task<T> GetResponse<T>(Uri url)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            try
            {
                var response = await client.GetAsync(url);
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();

                return JsonConvert.DeserializeObject<T>(responseBody);
            }
            catch
            {
                ..do something..
            }
        }
    }
}

对于单一职责概念,我希望该层仅调用API并在出现问题时捕获异常。由于在抛出异常的情况下决定返回什么(在上面的控制器中)不是它的责任,而只是捕获它,因此我想将异常冒泡到控制器中。最终,控制器将看到返回的结果给出了异常,从而将返回某些内容,或者如果未找到该服务,则将返回404等等。但这是它的责任是确定返回什么,而不是业务服务。所以我的问题是:冒泡这种情况的最佳实践是什么?谢谢!

1 个答案:

答案 0 :(得分:2)

在最简单的情况下,您可以直接让异常冒泡并在控制器中捕获它。如果要变得更复杂,可以让业务层捕获预期的异常,然后抛出其自己的预期异常类型。然后,控制器(或异常处理过滤器)捕获这些业务异常并将其转换为HTTP响应代码。