using System; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace _0_Framework.Exceptions.Handler; public class CustomExceptionHandler : IExceptionHandler { private readonly ILogger _logger; public CustomExceptionHandler(ILogger logger) { _logger = logger; } public async ValueTask TryHandleAsync(HttpContext context, Exception exception, CancellationToken cancellationToken) { _logger.LogError( "Error Message: {exceptionMessage}, Time of occurrence {time}", exception.Message, DateTime.UtcNow); (string Detail, string Title, int StatusCode) details = exception switch { InternalServerException => ( exception.Message, exception.GetType().Name, context.Response.StatusCode = StatusCodes.Status500InternalServerError ), BadRequestException => ( exception.Message, exception.GetType().Name, context.Response.StatusCode = StatusCodes.Status400BadRequest ), NotFoundException => ( exception.Message, exception.GetType().Name, context.Response.StatusCode = StatusCodes.Status404NotFound ), UnAuthorizeException => ( exception.Message, exception.GetType().Name, context.Response.StatusCode = StatusCodes.Status401Unauthorized ), _ => ( exception.Message, exception.GetType().Name, context.Response.StatusCode = StatusCodes.Status500InternalServerError ) }; var problemDetails = new ProblemDetails { Title = details.Title, Detail = details.Detail, Status = details.StatusCode, Instance = context.Request.Path }; problemDetails.Extensions.Add("traceId", context.TraceIdentifier); await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken); return true; } }