當前位置: 妍妍網 > 碼農

在 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 應用程式中配置自訂例外處理程式。此方法提供了一種可靠的機制,用於管理不同型別的異常並改進應用程式中的整體錯誤處理策略。實施詳細的問題響應不僅可以增強使用者體驗,還有助於偵錯和維護。

如果你喜歡我的文章,請給我一個贊!謝謝