Перейти к содержанию

Фильтры исключений: собственная обработка исключений для методов действий

Ранее уже рассказывалось о компонентах для обработки ошибок. Это позволяет перехватывать исключения из любого компонента, находящегося на более позднем этапе, и обрабатывать его.
Фильтры исключений же можно применять, когда необходимо особое поведение для MVC или конкретных маршрутов, например, если в приложении есть и страницы Razor, и контроллеры WebApi, необходимо разграничивать поведение обработки ошибок: для страниц Razor ответ предполагается в формате HTML, для контроллеров — в формате JSON.
Фильтры исключений позволяют обрабатывать исключение в конвейере фильтров и генерировать соответствующее тело ответа. Компонент обработчика исключений только перехватывает ошибки без тела, поэтому измененный ответ WebAPI не затрагивается.

Важно

Атрибут [ApiController] преобразует StatusCoreResult в объект ProblemDetails, но он не перехватывает исключения.

Фильтры исключений могут перехватывать исключения не только из методов действий и обработчиков страниц, но и если исключение произойдет:

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

Важно

Фильтры исключений не перехватывают исключения в фильтрах кроме фильтров действий и страниц, а также исключения, возникающие при выполнении IActionResult, например при отрисовке Razor в HTML

Реализуем фильтр исключений для нашего контроллера:

public class HandleExceptionAttribute : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        var error = new ProblemDetails
        {
            Title = "An error occured",
            Detail = context.Exception.Message,
            Status = 500,
            Type = "https://httpstatuses.com/500"
        };

        context.Result = new ObjectResult(error)
        {
            StatusCode = 500
        };
        context.ExceptionHandled = true;
    }
}


Последнее обновление : 3 мая 2023 г.
Дата создания : 3 октября 2022 г.

Комментарии

Комментарии