ASP.NET异常处理:ExceptionFilterAttribute vs Overwrite ExecuteAsync

时间:2017-10-04 02:59:21

标签: c# asp.net asp.net-mvc asp.net-web-api

在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;
    }
}

感谢您的支持!

1 个答案:

答案 0 :(得分:2)

首先,这是一个范式问题:composition over inheritance

其次,异常过滤器专门用于处理异常而不是其他任何东西(Single Responsibility principle之后)。

覆盖ExecuteAsync来处理异常就像采取更长,更复杂的路线。你必须编写更多的代码,并有更多的可能性来打破一些东西。喜欢:

  • 在检查base.ExecuteAsync之前,您确定IsFaulted的任务是否始终完成?
  • 在通过过滤器处理异常时,您确定框架没有做任何额外的工作吗?