当前位置: 欣欣网 > 码农

在 ASP.NET Core 8 中配置自定义异常处理程序

2024-06-22码农


若要增强 ASP.NET Core 应用程序的复原能力和用户体验,实现自定义异常处理至关重要。本文将指导你配置自定义的「 IExceptionHandler 」实现,从而实现更结构化、信息更丰富的错误处理方法。

先决条件

若要将「 IExceptionHandler 」实现添加到 ASP.NET Core 请求管道,需要:

1. 使用依赖注入注册「 IExceptionHandler 」服务。
2. 在请求管道中注册「 ExceptionHandlingMiddleware 」。

第 1 步:注册服务

首先,需要将自定义异常处理程序注册为具有单例生存期的服务。请注意注入具有不同生存期的服务,以避免潜在问题。

在这里,我们还使用「 AddProblemDetails 」为常见异常生成详细响应。

builder.Services.AddExceptionHandler<CustomGlobalExceptionHandler>();
builder.Services.AddProblemDetails();

第 2 步:添加中间件

接下来,通过调用「 UseExceptionHandler 」将「 ExceptionHandlingMiddleware 」添加到请求管道:

app.UseExceptionHandler();

internalsealed classCustomGlobalExceptionHandler : IExceptionHandler
{
privatereadonlyILogger<CustomGlobalExceptionHandler> _logger;
publicCustomGlobalExceptionHandler(ILogger<CustomGlobalExceptionHandler> logger)
{
_logger = logger;
}
publicasyncValueTask<bool>TryHandleAsync(
HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken)
{
_logger.LogError(
exception,
"Unhandled exception occurred: {Message}",
exception.Message);
var problemDetails = newProblemDetails
{
Status = StatusCodes.Status500InternalServerError,
Title = "Internal Server Error",
Detail = "An unexpected error occurred. Please try again later."
};
httpContext.Response.StatusCode = problemDetails.Status.Value;
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
returntrue;
}
}




实现多个异常处理程序

ASP.NET Core 允许您添加多个「 IExceptionHandler 」实现,这些实现按注册顺序顺序调用。这对于使用异常进行流控制等方案特别有用。

定义自定义例外

定义自定义异常,例如「 BadRequestException 」和「 NotFoundException 」,这些异常与 API 返回的 HTTP 状态代码相对应。

internalsealed classBadRequestExceptionHandler : IExceptionHandler
{
privatereadonlyILogger<BadRequestExceptionHandler> _logger;
publicBadRequestExceptionHandler(ILogger<BadRequestExceptionHandler> logger)
{
_logger = logger;
}
publicasyncValueTask<bool>TryHandleAsync(
HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken)
{
if (exception isnotBadRequestException badRequestException)
{
returnfalse;
}
_logger.LogError(
badRequestException,
"Exception occurred: {Message}",
badRequestException.Message);
var problemDetails = newProblemDetails
{
Status = StatusCodes.Status400BadRequest,
Title = "Bad Request",
Detail = badRequestException.Message
};
httpContext.Response.StatusCode = problemDetails.Status.Value;
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
returntrue;
}
}





internalsealed classNotFoundExceptionHandler : IExceptionHandler
{
privatereadonlyILogger<NotFoundExceptionHandler> _logger;
publicNotFoundExceptionHandler(ILogger<NotFoundExceptionHandler> logger)
{
_logger = logger;
}
publicasyncValueTask<bool>TryHandleAsync(
HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken)
{
if (exception isnotNotFoundException notFoundException)
{
returnfalse;
}
_logger.LogError(
notFoundException,
"Exception occurred: {Message}",
notFoundException.Message);
var problemDetails = newProblemDetails
{
Status = StatusCodes.Status404NotFound,
Title = "Not Found",
Detail = notFoundException.Message
};
httpContext.Response.StatusCode = problemDetails.Status.Value;
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
returntrue;
}
}





注册处理程序

注册两个异常处理程序,以确保它们是请求管道的一部分:

builder.Services.AddExceptionHandler<BadRequestExceptionHandler>();
builder.Services.AddExceptionHandler<NotFoundExceptionHandler>();
builder.Services.AddExceptionHandler<CustomGlobalExceptionHandler>();
builder.Services.AddProblemDetails();

在此设置中,「BadRequestExceptionHandler」将首先尝试处理异常。如果它无法处理异常,则接下来将调用「NotFoundExceptionHandler」。

通过执行这些步骤,可以在 ASP.NET Core 应用程序中配置自定义异常处理程序。此方法提供了一种可靠的机制,用于管理不同类型的异常并改进应用程序中的整体错误处理策略。实施详细的问题响应不仅可以增强用户体验,还有助于调试和维护。

如果你喜欢我的文章,请给我一个赞!谢谢