ASP.NET Core 8 全域錯誤處理 IExceptionHandler

在 ASP.NET Core 8 中新增了 IExceptionHandler 介面,簡化了建立全域錯誤(例外)處理需要撰寫的程式碼,變得很簡單,馬上來看範例:

建立中介軟體(Middleware),名稱為 GlobalExceptionHandlerMiddleware ,實作 IExceptionHandler 介面:
    
public class GlobalExceptionHandlerMiddleware(ILogger<GlobalExceptionHandlerMiddleware> logger) : IExceptionHandler
{
    public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception,
        CancellationToken cancellationToken)
    {
        logger.LogError(exception, "GlobalExceptionHandlerMiddleware Error, TraceIdentifier: {TraceIdentifier}",
            traceIdentifier);

        httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        var errorResponse = new
        {
            Message = "發生未預期的錯誤,請聯絡系統管理員",
        };

        httpContext.Response.ContentType = "application/json";
        await httpContext.Response.WriteAsJsonAsync(errorResponse, cancellationToken);

        return true;
    }
}
    

然後就是在 Program.cs 中註冊:
    
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddExceptionHandler<GlobalExceptionHandlerMiddleware>();
var app = builder.Build();
app.UseExceptionHandler(option => { });
    

API 會收到的範例回應如下:
    
{
  "message": "發生未預期的錯誤,請聯絡系統管理員。",
}
    

如果無法成功捕捉錯誤,很可能是因為有其他中介軟體(Middleware)衝突,可以嘗試把 UseExceptionHandler 這行程式碼往後移動到其他中介軟體下方嘗試看看。

參考資料:
Microsoft.Learn - Handle errors in ASP.NET Core
Microsoft.Learn - IExceptionHandler Interface
GitHub dotnet/aspnetcore Discussions - Understanding the IExceptionHandler in .NET 8 for Global Exception Handling
Microsoft .NET Source Browser

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com