From bc9f2348103a98e94717a61eb57fc614b7b842bd Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 4 Aug 2026 20:37:11 +0200 Subject: [PATCH] Add global exception handling middleware Introduced `ExceptionHandlingMiddleware` to handle exceptions globally in the application. The middleware captures exceptions thrown during the request pipeline, logs them, and returns appropriate HTTP responses in JSON format. Key features: - Handles `JobException` with a 400 Bad Request response. - Handles unhandled exceptions with a 500 Internal Server Error. - Logs warnings for `JobException` and errors for unhandled exceptions. - Sets response `ContentType` to `application/json` and writes error details as JSON. Added necessary `using` directives for required namespaces. --- .../Middleware/ExceptionHandlingMiddleware.cs | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 ECMJobRunner.WebCron/Middleware/ExceptionHandlingMiddleware.cs diff --git a/ECMJobRunner.WebCron/Middleware/ExceptionHandlingMiddleware.cs b/ECMJobRunner.WebCron/Middleware/ExceptionHandlingMiddleware.cs new file mode 100644 index 0000000..d76ed1c --- /dev/null +++ b/ECMJobRunner.WebCron/Middleware/ExceptionHandlingMiddleware.cs @@ -0,0 +1,74 @@ +using ECMJobRunner.Application.Common.Exceptions; +using Microsoft.AspNetCore.Mvc; +using System.Net; + +namespace ECMJobRunner.WebCron.Middleware; + +/// +/// Middleware for handling exceptions globally in the application. +/// Captures exceptions thrown during the request pipeline execution, +/// logs them, and returns an appropriate HTTP response with a JSON error details. +/// +/// +/// Initializes a new instance of the class. +/// +/// The next middleware in the request pipeline. +/// The logger instance for logging exceptions. +public class ExceptionHandlingMiddleware(RequestDelegate Next, ILogger Logger) +{ + /// + /// Invokes the middleware to handle the HTTP request. + /// + /// The HTTP context of the current request. + /// A task that represents the asynchronous operation. + public async Task InvokeAsync(HttpContext context) + { + try + { + await Next(context); // Continue down the pipeline + } + catch (Exception ex) + { + await HandleExceptionAsync(context, ex, Logger); + } + } + + /// + /// Handles exceptions by logging them and writing an appropriate JSON response. + /// + /// The HTTP context of the current request. + /// The exception that occurred. + /// The logger instance for logging the exception. + /// A task that represents the asynchronous operation. + private static async Task HandleExceptionAsync(HttpContext context, Exception exception, ILogger logger) + { + context.Response.ContentType = "application/json"; + + ValidationProblemDetails details; + + switch (exception) + { + case JobException jobEx: + logger.LogWarning(jobEx, "Job exception occurred."); + context.Response.StatusCode = (int)HttpStatusCode.BadRequest; + details = new() + { + Title = "Job Exception", + Detail = jobEx.Message + }; + break; + default: + logger.LogError(exception, "Unhandled exception occurred."); + context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + details = new() + { + Title = "Internal Server Error", + Detail = "An unexpected error occurred. Please try again later." + }; + break; + } + + if (details is not null) + await context.Response.WriteAsJsonAsync(details); + } +} \ No newline at end of file