在我的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等等。但这是它的责任是确定返回什么,而不是业务服务。所以我的问题是:冒泡这种情况的最佳实践是什么?谢谢!
答案 0 :(得分:2)
在最简单的情况下,您可以直接让异常冒泡并在控制器中捕获它。如果要变得更复杂,可以让业务层捕获预期的异常,然后抛出其自己的预期异常类型。然后,控制器(或异常处理过滤器)捕获这些业务异常并将其转换为HTTP响应代码。