2017-10-04 3 views
1

ASP.NETでは、ExceptionFilterAttributeを使用して例外を処理することをMicrosoftに提案しています。 Exception FiltersASP.NET例外処理:ExceptionFilterAttributeと上書きExecuteAsync

しかし私はそれを扱う他の方法があると思います。しかし、私はそれらの違いがどういうものか分かりません:

  • 私たちはこのように使うべきではないのですか?
  • 例えば

:私は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; 
    } 
} 

ありがとう!

答えて

2

まず、パラダイムの問題:composition over inheritanceです。

第2に、例外フィルタは例外を処理するように特別に設計されており、他には何もありません(Single Responsibility principle)。

例外を処理するには、ExecuteAsyncを無効にすると、より長く複雑なルートを取るようになります。より多くのコードを書く必要があり、何かを壊す可能性がさらにあります。同様に:

  • はあなたがIsFaultedをチェックする前にbase.ExecuteAsyncからタスクが常に完成されていることを確認していますか?
  • フィルターで例外を処理するときにフレームワークが追加作業をしていないことを確認してください。