在 ASP.NET Core 8 中新增了 IExceptionHandler 介面,簡化了建立全域錯誤(例外)處理需要撰寫的程式碼,變得很簡單,馬上來看範例:
建立中介軟體(Middleware),名稱為 GlobalExceptionHandlerMiddleware ,實作 IExceptionHandler 介面:
然後就是在 Program.cs 中註冊:
API 會收到的範例回應如下:
如果無法成功捕捉錯誤,很可能是因為有其他中介軟體(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
建立中介軟體(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
感謝教學!
回覆刪除