在ASP.NET中,Microsoft建议我们使用ExceptionFilterAttribute来处理异常。 Exception Filters
但我认为我们还有其他办法来处理它。但我不确定这些事情之间有什么区别:
例如:我可以通过覆盖Controller类的ExecuteAsync来处理:
public class BaseController : ApiController
{
public async override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
var response = base.ExecuteAsync(controllerContext, cancellationToken);
if (response.IsFaulted)
{
HttpResponseMessage errorResponse = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest);
if (response.Exception.InnerException is NotImplementedException)
{
errorResponse.Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(new { ErrorCode = System.Net.HttpStatusCode.BadRequest, Message = response.Exception.InnerExceptions }));
}
errorResponse.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return errorResponse;
}
return await response;
}
}
感谢您的支持!
答案 0 :(得分:2)
首先,这是一个范式问题:composition over inheritance。
其次,异常过滤器专门用于处理异常而不是其他任何东西(Single Responsibility principle之后)。
覆盖ExecuteAsync
来处理异常就像采取更长,更复杂的路线。你必须编写更多的代码,并有更多的可能性来打破一些东西。喜欢:
base.ExecuteAsync
之前,您确定IsFaulted
的任务是否始终完成?