【问题标题】:How to bubble up an exception如何冒泡异常
【发布时间】:2019-05-07 20:52:10
【问题描述】:

在我的 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 或等等..但决定返回什么将是它的责任,而不是业务服务的责任。所以我的问题是:在这种情况下冒泡的最佳做法是什么?谢谢!

【问题讨论】:

  • 如果您不需要对异常执行任何操作,那么只需忽略它就会导致它通过调用堆栈“冒泡”,直到有东西捕获它(这是您将返回 @ 987654322@)。如果您确实需要在发生异常时做某事(资源清理、服务器端日志记录等),但您仍然希望它冒泡,那么您仍然可以拥有您的catch块 - 只需以 throw 结束每个块,这样异常仍然会冒泡到下一个调用者。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-08-14
    • 2013-01-18
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多