【发布时间】: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