Фильтры исключений: собственная обработка исключений для методов действий¶
Ранее уже рассказывалось о компонентах для обработки ошибок. Это позволяет перехватывать исключения из любого компонента, находящегося на более позднем этапе, и обрабатывать его.
Фильтры исключений же можно применять, когда необходимо особое поведение для 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 октября 2022 г.