Global exception handling
The GlobalExceptionFilter
is an attribute designed to handle exceptions globally across your application. By using this filter, you can centralize the logic for handling exceptions, making it easier to manage and maintain.
Key Features
Exception handling: Handles exceptions both synchronously and asynchronously.
Service integration: Integrates with an optional IExceptionHandler
service, if available, to delegate the exception handling process. Thus you can build your own exception handling mechanism.
HTTP response mapping: Maps exceptions to their respective HTTP status codes and produces a consistent API response. Specifically for HttpRequestException class.
Installation
dotnet add package Eiffel.CrossCutting.ExceptionHandling
You should install Eiffel.CrossCutting.ExceptionHandling NuGet package into your application.
Usage
To appy this filter to all controllers in your application, add to Mvc filters.
// Program.cs (.NET5 and above)
public static async Task Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Applies api response filter for all controllers
builder.Services.AddControllers(options =>
{
options.Filters.Add<GlobalExceptionFilter>();
});
var app = builder.Build();
app.Run();
}
Custom exception handling
The IExceptionHandler
interface provides a contract for handling exceptions. By implementing this interface, you can provide custom logic to determine the HTTP status code and error message based on different exceptions.
/// <summary>
/// Exception handler
/// </summary>
public interface IExceptionHandler
{
/// <summary>
/// Handle synchronously operation exceptions
/// </summary>
/// <param name="exception">Exception</param>
/// <returns>HttpStatusCode, ErrorMessage tuple</returns>
Tuple<HttpStatusCode, string> Handle(Exception exception);
/// <summary>
/// Handle asynchronously operation exceptions
/// </summary>
/// <param name="exception">Exception</param>
/// <returns>HttpStatusCode, ErrorMessage tuple</returns>
Task<Tuple<HttpStatusCode, string>> HandleAsync(Exception exception);
}
Example exception handler
public class CustomExceptionHandler : IExceptionHandler
{
public Tuple<HttpStatusCode, string> Handle(Exception exception)
{
// Your implementation details.. (logging, localization etc.)
// Return HTTP status code and error message
return new Tuple<HttpStatusCode, string>(statusCode, errorMessage);
}
public async Task<Tuple<HttpStatusCode, string>> HandleAsync(Exception exception)
{
// Your implementation details.. (logging, localization etc.)
// Return HTTP status code and error message
return new Tuple<HttpStatusCode, string>(statusCode, errorMessage);
}
}
After implementation you should register exception handler class.
// Program.cs (.NET5 and above)
public static async Task Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Register your custom exception handler
builder.Services.AddSingleton<IExceptionHandler, CustomExceptionHandler>();
var app = builder.Build();
app.Run();
}
Last updated