Я работаю над проектом 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;
}
Тогда в моем фильтре я бросала context.Exception
назад к MyException
и пытается получить доступ к свойству, но свойство всегда возвращался в null
.
var ex = context.Exception as MyException;
var code = ex.statusCode; // Always comes back as null
Моя вторая попытка была добавить код состояния Data
свойство, которое MyException
наследуется от Exception
.
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
Две попытки, которые я упоминаю, вставляются перед 'throw except'. – Rainbacon
@ Kris Я добавил вызовы, которые я делал, чтобы сделать более понятным, как именно я пытался передать код состояния. – Rainbacon