私は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
私の第二の試みはMyException
がException
から継承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
にキーがありませんでした。例外メッセージにステータスコードを含めてフィルタで解析することができますが、間違った解決策だと思っているので、そうしないと思います。ステータスコードを例外フィルタに渡して、例外を処理する際に使用できるようにするにはどうすればよいですか?
if(!httpResponseMessage.IsSuccessStatusCode){var message = "外部API呼び出しエラー"; var except = new MyException(メッセージ);例外を除く。 }このコードでは、どこにステータスコードを渡していますか? – Krishna
私が言及する2つの試みは、 'throw except'の前に挿入されます。 – Rainbacon
@Krisステータスコードを渡そうとしていた方法をより明確にするために呼び出しを追加しました – Rainbacon