ExceptionFilterAttribute не обрабатывает исключения свойств

Я реализовал класс ExceptionFilterAttribute и зарегистрировал его в классе WebApiConfig. Фильтр действий работает хорошо и обрабатывает любое исключение, возникающее в любом действии, но проблема в том, что когда возникает исключение, в то время как в любом из свойств контроллера фильтр действия не обрабатывает это исключение.

[NotImplExceptionFilterAttribute]
public class AnyController : APIController
{
    private readonly ModelDBContext _db = new ModelDBContext();

    //some actions
}

в упомянутом примере конструктор ModelDBContext содержит некоторую логику, которая может вызвать исключение. Это исключение не будет обрабатываться атрибутом ExceptionFilterAttribute. Почему??? И как с этим справиться?


person Adham    schedule 12.03.2015    source источник


Ответы (2)


Проблема в размахе.

При создании экземпляра контроллера частный член класса _db инициализируется перед выполнением любых методов класса. Это поведение CLR.

Таким образом, фильтр действий не будет перехватывать исключение, возникающее во время построения/инициализации вашего объекта контроллера, например, сбой при создании экземпляра ModelDBContext.

Одним из решений является создание и удаление ModelDBContext экземпляров при каждом запросе, и некоторые могут возразить, что это правильный подход, если вы намерены изящно обрабатывать (или регистрировать) сбои подключения (будь то к БД или серверной службе).

Вы также можете найти полезными IServiceLocator и фреймворк, такой как "Unity" или "Ninject", так что вам не нужно везде "жестко кодировать" операторы new ModelDBContext();, но это уже другая тема. Основная причина заключается в том, что вы инициализируете вне области действия метода, фильтры действий не поймают это.

person Shaun Wilson    schedule 13.03.2015

в основном, простой ответ прост: фильтр исключений - это фильтр уровня действия.

Сначала проверьте эту диаграмму: development.aspx" rel="nofollow">http://blogs.msdn.com/b/kiranchalla/archive/2012/05/06/asp-net-mvc4-web-api-stack-diagram-currently-in- development.aspx Затем перейдите к ApiController, строка № 232. Там видно, что если есть хотя бы один фильтр, то ExceptionFilterResult будет использоваться для переноса результата конечного действия. Внутри ExceptionFilterResult есть простой try-catch, если выдается исключение, то вызываются все зарегистрированные фильтры исключений. Итак, краткое изложение всего написанного выше: 1) фильтр исключений не отвечает за обработку ошибок над действием контроллера 2) фильтр исключений не существует в момент, когда экземпляр контроллера создается DI-контейнером и когда ваш ModelDBContext выдает исключение

Надеюсь, это ответит на ваш вопрос.

person Volodymyr Usarskyy    schedule 12.03.2015