2017-01-24 8 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; 
} 

Тогда в моем фильтре я бросала 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 не было ключей. Я знаю, что я мог бы включить код состояния в мое сообщение об исключении, а затем проанализировать его в фильтре, но я бы предпочел не делать этого, потому что я думаю, что это неправильное решение. Как я могу получить код статуса для моего фильтра исключения, чтобы я мог использовать его при обработке моих исключений?

+0

if (! HttpResponseMessage.IsSuccessStatusCode) {var message = "Ошибка вызова внешнего API"; var except = new MyException (сообщение); бросить кроме; } в этом коде, где вы передаете код состояния? – Krishna

+0

Две попытки, которые я упоминаю, вставляются перед 'throw except'. – Rainbacon

+0

@ Kris Я добавил вызовы, которые я делал, чтобы сделать более понятным, как именно я пытался передать код состояния. – Rainbacon

ответ

0

Исключение может быть обернуто выше в стеке вызовов. Тогда он будет во внутреннем исключении. Вы можете повторить все внутренние исключения, чтобы узнать, является ли какое-либо из них вашим исключением, но ваш код для доступа к свойствам должен работать должным образом.

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

      ex = ex.InnerException; 
     } 

 Смежные вопросы

  • Нет связанных вопросов^_^