84 lines
2.6 KiB
C#
84 lines
2.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
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<CustomExceptionHandler> _logger;
|
|
|
|
public CustomExceptionHandler(ILogger<CustomExceptionHandler> logger)
|
|
{
|
|
_logger = logger;
|
|
}
|
|
|
|
public async ValueTask<bool> 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, Dictionary<string, object>? Extra) details = exception switch
|
|
{
|
|
InternalServerException =>
|
|
(
|
|
exception.Message,
|
|
exception.GetType().Name,
|
|
context.Response.StatusCode = StatusCodes.Status500InternalServerError,
|
|
null
|
|
),
|
|
BadRequestException bre =>
|
|
(
|
|
exception.Message,
|
|
exception.GetType().Name,
|
|
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
|
bre.Extra
|
|
),
|
|
NotFoundException =>
|
|
(
|
|
exception.Message,
|
|
exception.GetType().Name,
|
|
context.Response.StatusCode = StatusCodes.Status404NotFound,
|
|
null
|
|
),
|
|
UnAuthorizeException =>
|
|
(
|
|
exception.Message,
|
|
exception.GetType().Name,
|
|
context.Response.StatusCode = StatusCodes.Status401Unauthorized,
|
|
null
|
|
),
|
|
_ =>
|
|
(
|
|
exception.Message,
|
|
exception.GetType().Name,
|
|
context.Response.StatusCode = StatusCodes.Status500InternalServerError,
|
|
null
|
|
)
|
|
};
|
|
|
|
var problemDetails = new ProblemDetails
|
|
{
|
|
Title = details.Title,
|
|
Detail = details.Detail,
|
|
Status = details.StatusCode,
|
|
Instance = context.Request.Path,
|
|
Extensions = details.Extra ?? new Dictionary<string, object>()
|
|
};
|
|
|
|
|
|
|
|
problemDetails.Extensions.Add("traceId", context.TraceIdentifier);
|
|
|
|
await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken);
|
|
|
|
return true;
|
|
}
|
|
} |