Улучшенная Обработка Исключений в ASP.NET Core 8. Начало
ASP.NET Core 8 скоро выйдет и принесёт крутые улучшения: больше не нужно писать своё промежуточное ПО для обработки исключений!
В ASP.NET Core 8 вы можете создать класс, реализующий интерфейс IExceptionHandler:
public interface IExceptionHandlerВажная вещь: нужно вернуть True или False:
{
ValueTask<bool> TryHandleAsync(
HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken);
}
- при True выполнение конвейера завершится, и другое промежуточное ПО в конвейере не будет вызываться.
- при False, конвейер продолжит выполнение.
public class DefaultExHandler :Вы можете записать в ответ что угодно. Здесь это экземпляр ProblemDetails, потому что это стандарт RFC для обработки ошибок, возвращаемых в ответах HTTP API. Код состояния HTTP по умолчанию — 500, но его можно настроить:
IExceptionHandler
{
private ILogger<DefaultExHandler> _logger;
public DefaultExHandler(
ILogger<DefaultExHandler> logger)
{
_logger = logger;
}
public async ValueTask<bool> TryHandleAsync(
HttpContext ctx,
Exception ex,
CancellationToken ct)
{
_logger.LogError(ex, "Error occurred");
await httpContext.Response
.WriteAsJsonAsync(
new ProblemDetails
{
Status = (int)HttpStatusCode.InternalServerError,
Type = ex.GetType().Name,
Title = "Error occurred",
Detail = ex.Message,
Instance = $"{httpContext.Request.Method} {httpContext.Request.Path}"
});
return true;
}
}
httpContext.Response.StatusCode =Регистрация обработчика ошибок:
(int)HttpStatusCode.RequestTimeout;
var builder = WebApplication.CreateBuilder(args);Окончание следует…
builder.Services
.AddExceptionHandler<DefaultExHandler>();
var app = builder.Build();
app.UseExceptionHandler(opt => { });
…
app.Run();
Источник: https://anthonygiretti.com/2023/06/14/asp-net-core-8-improved-exception-handling-with-iexceptionhandler/