Обработка ошибок с помощью промежуточного ПО¶
Так как ошибки возникают в любых приложениях, важно уметь их правильно обрабатывать. Согласно философии ASP.NET Core, любая функциональность, в том числе и обработка ошибок, является подключаемой. Следовательно, ее необходимо явно активировать.
Рассмотрим два типа ошибок — исключения и коды состояния ошибок.
Если исключение возникает в компоненте конвейера, оно распространяется вверх по конвейеру. Если конвейер не обработает исключение, веб-сервер вернет пользователю код ошибки 500.

Иногда ошибка не вызывает исключения, вместо этого промежуточное ПО генерирует код ошибки. Например — когда запрашиваемый путь не найден. В этом случае сгенерируется ошибка 404.
Компонент обработки ошибок пытается решить эти проблемы, изменяя ответ до того, как приложение вернет его пользователю. Обычно он возвращает либо сведения об ошибке, либо специальную страницу. Этот компонент всегда следует размещать в начале конвейера, чтобы он мог улавливать любые ошибки, возникшие в последующих компонентах.
Просмотр исключений в окружении разработки: DeveloperExceptionPage¶
В процессе разработки приложения при возникновении ошибки обычно необходимо иметь доступ к возможно большему количеству информации. Для этого существует DeveloperExceptionPageMiddleware, который добавляется в конвейер с помощью строки
Компонент перехватывает распространяющееся по конвейеру исключение и генерирует HTML-страницу с различными сведениями: трассировкой стека вызовов, сообщением исключения, заголовки, куки и т.п.
Важно! Этот компонент можно использовать только в процессе разработки!
Обработка исключений в промышленном окружении: ExceptionHandlerMiddleware¶
ExceptionHandlerMiddleware необходим, когда нужно, с одной стороны, уведомить пользователя об ошибке и, с другой стороны, сделать это консистентно с остальным приложением, но и без открытия чувствительной информации.
Поэтому обычно инициализация обработки ошибок выглядит так:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
//Дальнейшая настройка
}
Здесь, помимо примера инициализации
ExceptionHandlerMiddleware, видно, что можно собирать конвейер по разному в зависимости от окружения.Вот как выглядит последовательность событий при обработке возникшего исключения:
- часть промежуточного ПО выбрасывает исключение;
ExceptionHandlerMiddlewareперехватывает его;- определенный к этому моменту частичный ответ удаляется;
- промежуточное ПО перезаписывает путь запроса путём обработки ошибок (здесь -
/Error); - промежуточное ПО отправляет запрос обратно по конвейеру, как если бы исходный запрос был для пути обработки ошибок;
- конвейер генерирует новый ответ;
- когда ответ возвращается в
ExceptionHandlerMiddleware, он изменяет код ответа на 500 и продолжает передавать ответ по конвейеру на веб-сервер.
То же самое на картинке:

Основное преимущество повторного выполнения — возможность интегрировать сообщение об ошибке в макет сайта.
Несколько возможных проблем. Первое — промежуточное ПО может изменять ответ, только если ответ еще не был отправлен клиенту. В противном случае компонент не сработает, так как не сможет сбросить ответ.
Второе — если ошибка возникает вовремя повторного выполнения конвейера (например, при формировании меню в верхней части страницы), она не будет обработана. Из-за этой проблемы обычно рекомендуется страницы ошибок делать как можно проще, чтобы снизить вероятность возникновения повторных ошибок.
Обработка других ошибок: StatusCodePagesMiddleware¶
Помимо исключений, обычно порождающих ошибку сервера с кодом 500, в приложении возможны и другие ошибки, порождающие другие коды ошибок (обычно 4xx). Для их обработки можно использовать StatusCodePagesMiddleware. Чтобы добавить его в конвейер, воспользуемся командой
Однако, в этом случае компонент вернет простой текст с расшифровкой полученного кода (например, “Status Code: 404; Not Found”).
Также можно воспользоваться подходом с повторным выполнением конвейера. Для этого нужно воспользоваться таким методом:
Этот метод расширения настраивает
StatusCodePagesMiddleware для повторного выполнения конвейера в случае возникновения кода ошибки (4хх или 5хх). Видно, что при инициализации мы передали маркер строки форматирования. Таким образом, при ошибке с кодом 404 будет запущено повторное выполнение с путем /404.StatusCodePagesMiddleware можно использовать вместе с ExceptionHandlerMiddleware. StatusCodePagesMiddleware будет изменять ответ только в том случае, если тело ответа не было записано.
Дата создания : 20 сентября 2022 г.