Фильтры исключений в ASP.net

Фильтры исключений служат для обработки необработанных исключений, однако обрабатывают они не все исключения. Например, такие фильтры обрабатывают необработанные исключения, появляющиеся:

  • при создании объекта контроллера;
  • при выполнении фильтров действий либо методов контроллера;
  • при привязке модели.

Таким образом, фильтры исключений в ASP.net обрабатывают исключения, возникающие в фильтрах ресурсов/результатов либо при выполнении результата.

Это позволяет сделать вывод, что фильтры исключений в ASP.net не столь гибки, как, к примеру, компоненты middleware, которые тоже служат для обработки исключений.

Интерфейсы

Для работы с фильтрами исключений (Exception Filters) потребуется реализовать один из двух интерфейсов на выбор:

  • IExceptionFilter,
  • IAsyncExceptionFilter.

Существует возможность и по созданию класса фильтра исключений с его наследованием от абстрактного класса ExceptionFilterAttribute.

Методы для реализации

Если сравнивать с другими фильтрами, то Exception Filters поддерживают, в отличие от остальных, лишь один метод для каждого интерфейса:

  • OnException() для реализации IExceptionFilter,
  • OnExceptionAsync() для реализации IAsyncExceptionFilter.

В качестве параметра в метод OnException() передается объект ExceptionContext, содержащий все информационные данные о возникшем исключении.

Свойство context.ExceptionHandled

Если это свойство будет true, мы получим эффект обработанного исключения. То есть обработка продолжится, как будто никакого исключения и не было (браузеру отправится статус-код 200).

Для примера давайте определим следующий класс фильтра исключений:

Теперь воспользуемся параметром ExceptionContext, с помощью которого мы получим различные сведения об исключении, включая имя действия, в котором возникло исключение. Из полученной информации создадим объект ContentResult. Чтобы исключение считалось обработанным, следует установить, как было упомянуто выше, context.ExceptionHandled = true.

Применим данный фильтр к методу, в котором мы симулируем ошибочную ситуацию:

При обращении к данному методу у нас появится исключение -- деление числа на 0. Это исключение будет перехвачено соответствующим фильтром исключений, в результате чего мы увидим в своем веб-браузере информацию об исключении:

По материалам https://metanit.com/sharp/aspnet5/.