2017-01-24 20 views
0

私はWebAPIの2プロジェクトに取り組んでいると私はこのようになりますグローバル誤差フィルタ属性を実装しました:C#のグローバル例外フィルタに追加の例外データを渡すにはどうすればよいですか?

public class MyExceptionFilterAttribute: ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecuteContext context) 
    { 
     if (context.Exception is MyException) 
     { 
      // Handle MyException 
     } 
     else if (context.Exception is UnauthorizedAccessException) 
     { 
      // Handle UnauthorizedAccessException 
     } 
    } 
} 

私は外部のAPIへの呼び出しを行うとバック私はMyExceptionを投げるエラー応答を取得すると。

var httpResponseMessage = _httpClient.GetAsync(request).Result; 
if (!httpResponseMessage.IsSuccessStatusCode) 
{ 
    var message = "Error calling external API"; 
    var except = new MyException(message); 
    throw except; 
} 

私はAPIがMyExceptionの一環として、グローバルなエラーフィルタに返されるステータスコードを渡したいです。私の最初の試みは、ステータスコードをMyExceptionのプロパティとして追加することでした。

public class MyException : Exception 
{ 
    public HttpStatusCode statusCode; 
    public MyException() : base() { } 
    public MyException(string message, HttpStatusCode statusCode) : base(message) 
    { 
     this.statusCode = statusCode; 
    } 
} 

、例外投げで:

var httpResponseMessage = _httpClient.GetAsync(request).Result; 
if (!httpResponseMessage.IsSuccessStatusCode) 
{ 
    var message = "Error calling external API"; 
    var except = new MyException(message, httpResponseMessage.StatusCode); 
    throw except; 
} 

はその後、私のフィルタでは、私は戻ってMyExceptionからcontext.Exceptionをキャストし、プロパティにアクセスしようとしますが、プロパティは常にnullとして戻ってきました。

var ex = context.Exception as MyException; 
var code = ex.statusCode; // Always comes back as null 

私の第二の試みはMyExceptionExceptionから継承Dataプロパティにステータスコードを追加することでした。

var httpResponseMessage = _httpClient.GetAsync(request).Result; 
if (!httpResponseMessage.IsSuccessStatusCode) 
{ 
    var message = "Error calling external API"; 
    var except = new MyException(message); 
    except.Data.add("status", httpResponseMessage.StatusCode); 
    throw except; 
} 

ただし、フィルタでアクセスしようとすると、Dataにキーがありませんでした。例外メッセージにステータスコードを含めてフィルタで解析することができますが、間違った解決策だと思っているので、そうしないと思います。ステータスコードを例外フィルタに渡して、例外を処理する際に使用できるようにするにはどうすればよいですか?

+0

if(!httpResponseMessage.IsSuccessStatusCode){var message = "外部API呼び出しエラー"; var except = new MyException(メッセージ);例外を除く。 }このコードでは、どこにステータスコードを渡していますか? – Krishna

+0

私が言及する2つの試みは、 'throw except'の前に挿入されます。 – Rainbacon

+0

@Krisステータスコードを渡そうとしていた方法をより明確にするために呼び出しを追加しました – Rainbacon

答えて

0

例外がコールスタックで上位にラップされている可能性があります。それは内部の例外になります。内部例外のすべてを繰り返して、それらの例外が例外であるかどうかを確認できますが、プロパティにアクセスするコードは期待通りに機能するはずです。

 var ex = context.Exception; 
     while (ex != null) 
     { 
      if (ex is MyException) 
      { 
       // Do work 
       break; 
      } 

      ex = ex.InnerException; 
     } 
関連する問題