using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
namespace MyApi.Middleware;
public class GlobalExceptionHandler(ILogger<GlobalExceptionHandler> logger)
: IExceptionHandler
{
public async ValueTask<bool> TryHandleAsync(
HttpContext ctx,
Exception exception,
CancellationToken ct)
{
logger.LogError(exception, "Unhandled exception: {Message}", exception.Message);
var problem = exception switch
{
ArgumentException => new ProblemDetails
{
Status = StatusCodes.Status400BadRequest,
Title = "Bad Request",
Detail = exception.Message
},
KeyNotFoundException => new ProblemDetails
{
Status = StatusCodes.Status404NotFound,
Title = "Not Found",
Detail = exception.Message
},
UnauthorizedAccessException => new ProblemDetails
{
Status = StatusCodes.Status401Unauthorized,
Title = "Unauthorized",
Detail = exception.Message
},
_ => new ProblemDetails
{
Status = StatusCodes.Status500InternalServerError,
Title = "Internal Server Error",
Detail = "An unexpected error occurred."
}
};
problem.Extensions["traceId"] = ctx.TraceIdentifier;
ctx.Response.StatusCode = problem.Status!.Value;
await ctx.Response.WriteAsJsonAsync(problem, ct);
return true;
}
}