Улучшенная Обработка Исключений в ASP.NET Core 8. Окончание
Начало
Цепочка обработчиков исключений
Вы можете связать обработчики исключений в цепочку. При возврате False, конвейер продолжит выполнение и вызовет следующий обработчик исключений. Если все обработчики исключений возвратят False, конвейер выполнит все ПО промежуточного слоя, оставшиеся в конвейере. Вы также можете комбинировать обработчики исключений и промежуточное ПО.
Чтобы связать обработчики исключений, вы ДОЛЖНЫ определить обработчик исключений по умолчанию, который будет запускаться (и размещаться в самом конце) для обработки любого исключения, которое не было обработано предыдущими обработчиками. Порядок имеет значение! Ниже показан обработчик, который обрабатывает (только) TimeOutException и прерывает выполнение конвейера, если исключение фактически является TimeOutException. В противном случае выполнение конвейера продолжится и достигнет обработчика исключений по умолчанию:
public class TimeOutExHandler :Использование:
IExceptionHandler
{
private ILogger<DefaultExHandler> _logger;
public TimeOutExceptionHandler(
ILogger<DefaultExHandler> logger)
{
_logger = logger;
}
public async ValueTask<bool> TryHandleAsync(
HttpContext ctx,
Exception ex,
CancellationToken ct)
{
_logger.LogError(ex, "A timeout occurred");
if (ex is TimeoutException)
{
httpContext.Response.StatusCode =
(int)HttpStatusCode.RequestTimeout;
await httpContext.Response
.WriteAsJsonAsync(
new ProblemDetails
{ … });
return true;
}
return false;
}
}
var builder = WebApplication.CreateBuilder(args);Если при выполнении конечной точки возникнет TimeOutException, оно будет обработано TimeOutExHandler. Любой другой вид исключений достигнет обработчика TimeOutExHandler, но не будет им обработан (т.к. TimeOutExHandler вернёт false), а будет обработан DefaultExHandler.
builder.Services
.AddExceptionHandler<TimeOutExHandler>();
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/