byte916
@byte916

Как правильно отлавливать все исключения через фильтр исключений?

Всем привет!

Пытаюсь отлавливать все исключения в web api контролах
С этой целью написал такой фильтр

public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext filterContext)
        {
              // Вот тут записываем в лог информацию об исключении
        }
    }


Проблема заключается в том, что само исключение почему то теряется. В обьекте filterContext.Exception всегда содержится вот что:

Message = Object reference not set to an instance of an object.
Data = System.Collections.ListDictionaryInternal
InnerException = 
TargetSite = Void Log(System.Web.Http.Filters.HttpActionExecutedContext)
StackTrace =    at MyApplication.Filters.WebApiLogFIlter.Log(HttpActionExecutedContext actionExecutedContext)
   at MyApplication.Filters.WebApiLogFIlter.OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
   at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()
HelpLink = 
Source = MyApplication
HResult = -2147467261


Что я делаю не так, и как получить исключение в фильтре исключений?
  • Вопрос задан
  • 355 просмотров
Решения вопроса 1
1) Фильтры исключений
С помощью свойства actionExecutedContext.Exception мы можем получить информацию об исключении, возникшем в методе контроллера. У вас походу исключение возникло в самом фильтре, и стэк трейс начинается от туда.

2) Глобальные фильтры и переопределение фильтров

Второй вариант для исключений более правильный.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы