Created
December 4, 2023 02:28
-
-
Save cashwu/040fe1bd6f4b352f4cef8286dfc9b623 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| internal sealed class GlobalExceptionHandler : IExceptionHandler | |
| { | |
| private readonly ILogger<GlobalExceptionHandler> _logger; | |
| public GlobalExceptionHandler(ILogger<GlobalExceptionHandler> logger) | |
| { | |
| _logger = logger; | |
| } | |
| public async ValueTask<bool> TryHandleAsync( | |
| HttpContext httpContext, | |
| Exception exception, | |
| CancellationToken cancellationToken) | |
| { | |
| _logger.LogError( | |
| exception, "Exception occurred: {Message}", exception.Message); | |
| var problemDetails = new ProblemDetails | |
| { | |
| Status = StatusCodes.Status500InternalServerError, | |
| Title = "Server error" | |
| }; | |
| httpContext.Response.StatusCode = problemDetails.Status.Value; | |
| await httpContext.Response | |
| .WriteAsJsonAsync(problemDetails, cancellationToken); | |
| return true; | |
| } | |
| } | |
| public class Programs | |
| { | |
| builder.Services.AddExceptionHandler<GlobalExceptionHandler>(); | |
| builder.Services.AddProblemDetails(); | |
| app.UseExceptionHandler(); | |
| } | |
| ---- | |
| internal sealed class BadRequestExceptionHandler : IExceptionHandler | |
| { | |
| private readonly ILogger<BadRequestExceptionHandler> _logger; | |
| public GlobalExceptionHandler(ILogger<BadRequestExceptionHandler> logger) | |
| { | |
| _logger = logger; | |
| } | |
| public async ValueTask<bool> TryHandleAsync( | |
| HttpContext httpContext, | |
| Exception exception, | |
| CancellationToken cancellationToken) | |
| { | |
| if (exception is not BadRequestException badRequestException) | |
| { | |
| return false; | |
| } | |
| _logger.LogError( | |
| badRequestException, | |
| "Exception occurred: {Message}", | |
| badRequestException.Message); | |
| var problemDetails = new ProblemDetails | |
| { | |
| Status = StatusCodes.Status400BadRequest, | |
| Title = "Bad Request", | |
| Detail = badRequestException.Message | |
| }; | |
| httpContext.Response.StatusCode = problemDetails.Status.Value; | |
| await httpContext.Response | |
| .WriteAsJsonAsync(problemDetails, cancellationToken); | |
| return true; | |
| } | |
| } | |
| internal sealed class NotFoundExceptionHandler : IExceptionHandler | |
| { | |
| private readonly ILogger<NotFoundExceptionHandler> _logger; | |
| public GlobalExceptionHandler(ILogger<NotFoundExceptionHandler> logger) | |
| { | |
| _logger = logger; | |
| } | |
| public async ValueTask<bool> TryHandleAsync( | |
| HttpContext httpContext, | |
| Exception exception, | |
| CancellationToken cancellationToken) | |
| { | |
| if (exception is not NotFoundException notFoundException) | |
| { | |
| return false; | |
| } | |
| _logger.LogError( | |
| notFoundException, | |
| "Exception occurred: {Message}", | |
| notFoundException.Message); | |
| var problemDetails = new ProblemDetails | |
| { | |
| Status = StatusCodes.Status404NotFound, | |
| Title = "Not Found", | |
| Detail = notFoundException.Message | |
| }; | |
| httpContext.Response.StatusCode = problemDetails.Status.Value; | |
| await httpContext.Response | |
| .WriteAsJsonAsync(problemDetails, cancellationToken); | |
| return true; | |
| } | |
| } | |
| public class Programs | |
| { | |
| builder.Services.AddExceptionHandler<BadRequestExceptionHandler>(); | |
| builder.Services.AddExceptionHandler<NotFoundExceptionHandler>(); | |
| builder.Services.AddProblemDetails(); | |
| app.UseExceptionHandler(); | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment