Фильтры исключений

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 11.12.2019

Фильтры исключений обрабатывают необработанные исключения, в том числе те, которые возникли при создании контроллера и привязки модели. При этом надо сразу отметить, что они обрабатывают не абсолютно все исключения в приложении, а только исключения, которые возникают при вызове действия контроллера в MVC. В частности,фильтры исключений обрабатывают необработанные исключения, которые возникают при создании объекта контроллера или страницы RazorPage, при привязке модели, при выполнении фильтров действий или методов контроллера или страницы RazorPage. Но фильтры исключений не обрабатывают исключения, которые возникают в фильтрах ресурсов, результатов или при выполнении результата.

В этом плане фильтры исключений менее гибки, чем, скажем, компоненты middleware, которые также предназначены для обработки исключений.

Фильтры исключений (Exception Filters) должны реализовать либо интерфейс IExceptionFilter, либо интерфейс IAsyncExceptionFilter. Также мы можем создать класс фильтра исключений, унаследовав его от абстрактного класса ExceptionFilterAttribute.

В отличие от других фильтров фильтры исключений имеют только один метод - OnException() (для реализации IExceptionFilter) и OnExceptionAsync() (для реализации IAsyncExceptionFilter). В метод OnException() в качестве параметра передается объект ExceptionContext, который содержит всю информацию о возникшем исключении.

При установке свойства context.ExceptionHandled равным true мы можем получить эффект, как будто мы обработали исключение. И в этому случае обработка запроса продолжится, как будто никакого исключения и не было, а браузеру будет отправлен статусный код 200 OK.

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

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;

namespace FiltersApp.Filters
{
    public class CustomExceptionFilterAttribute : Attribute, IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            string actionName = context.ActionDescriptor.DisplayName;
            string exceptionStack = context.Exception.StackTrace;
            string exceptionMessage = context.Exception.Message;
            context.Result = new ContentResult
            {
                Content = $"В методе {actionName} возникло исключение: \n {exceptionMessage} \n {exceptionStack}"
            };
            context.ExceptionHandled = true;
        }
    }
}

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

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

public class HomeController : Controller
{
    [CustomExceptionFilter]
    public IActionResult Index()
    {
        int x = 0;
        int y = 8 / x;
        return View();
    }
}

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

Фильтры исключений в ASP.NET Core
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850