“Houston, abbiamo un problema!
“
Quante volte ci siamo sentiti come gli astronauti dell’Apollo 13 mentre affrontavamo eccezioni non gestite nelle nostre applicazioni? Le eccezioni non gestite possono mandare in tilt i nostri sistemi, generare risposte di errore criptiche e rendere i log incomprensibili. Ma non temere, ASP.NET Core ci fornisce uno strumento potente per gestire queste situazioni: IExceptionHandler
.
Per gli sviluppatori impazienti di buttarsi nel codice, il progetto completo è disponibile su GitHub: ExceptionsHandler.NET
Perché IExceptionHandler?
Le eccezioni non gestite possono rovinare l’esperienza degli utenti delle nostre applicazioni e rendere difficile il debug e la risoluzione dei problemi. IExceptionHandler
ci consente di centralizzare la gestione delle eccezioni e fornire risposte coerenti e informative.
Ecco alcuni vantaggi dell’utilizzo di IExceptionHandler
:
- Risposte di errore strutturate e facili da comprendere per gli utenti dell’applicazione.
- Logging centralizzato delle eccezioni per semplificare il debug.
- Possibilità di personalizzare la gestione in base al tipo di eccezione.
- Mantenimento di un codice più pulito e leggibile separando la logica di gestione delle eccezioni.
Implementazione Step-by-Step
Ora che abbiamo capito perché una buona gestione delle eccezioni sia cruciale, vediamo come implementare IExceptionHandler
passo dopo passo.
1. Creazione del Progetto
- Usiamo Visual Studio e crea un nuovo progetto “ASP.NET Core Web API”.
- Scegliamo un nome per il progetto, ad esempio “ExceptionsHandler.NET“.
- Selezioniamo .NET 8.0 (o la versione più recente) come framework.
2. Creazione del Gestore di Eccezioni
Creiamo una nuova cartella chiamata “Handlers
” nella radice del nostro progetto, e al suo interno un nuovo file chiamato “GlobalExceptionHandler.cs
“.
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Mvc;
namespace ExceptionsHandler.NET.Handlers;
public class GlobalExceptionHandler(ILogger logger) : IExceptionHandler
{
public async ValueTask TryHandleAsync(HttpContext httpContext, Exception exception, CancellationToken cancellationToken)
{
logger.LogError(exception, "Houston, we have a problem! Our code decided to go skydiving without a parachute: {Message}", exception.Message);
var problemDetails = new ProblemDetails
{
Title = "Houston, we have a problem!",
Status = StatusCodes.Status500InternalServerError,
Detail = exception.Message
};
httpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken);
return true;
}
}
4. Configurazione dei Servizi
Ora, modifichiamo il file Program.cs
per registrare il gestore di eccezioni, middleware e abilitare ProblemDetails.
using ExceptionsHandler.NET.Handlers;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddExceptionHandler();
builder.Services.AddProblemDetails();
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.MapControllers();
app.UseExceptionHandler();
app.UseHttpsRedirection();
app.Run();
5. Test del Gestore di Eccezioni
Creiamo una nuova cartella chiamata “Controllers
” nella radice del nostro progetto, e al suo interno un nuovo file chiamato “HoustonController
.cs
“.
using Microsoft.AspNetCore.Mvc;
namespace ExceptionsHandler.NET.Controllers;
[ApiController]
[Route("[controller]/[action]")]
public class HoustonController : ControllerBase
{
[HttpGet]
public IActionResult Error()
{
throw new Exception("Oxygen leak in our API ship!");
}
}
- Avvia l’applicazione in modalità debug.
- Apri il browser e vai all’URL https://localhost:5000/swagger.
- Vedrai l’interfaccia di Swagger UI con l’elenco degli endpoint disponibili.
- Trova l’endpoint /Huston/Error che genera un’eccezione.
- Clicca su “Try it out” e poi su “Execute“.
- Verifica che la risposta sia una ProblemDetails con i dettagli dell’errore e lo status code 500.
Conclusione
In questo articolo abbiamo esplorato come IExceptionHandler
di ASP.NET Core possa aiutarci a gestire le eccezioni in modo elegante ed efficace. Abbiamo visto come configurare il progetto, creare un gestore personalizzato e testarlo con Swagger UI. Ricorda, la gestione delle eccezioni è un processo continuo di miglioramento. Continua a esplorare, sperimentare e imparare!
Ora Tocca a Te
- Condividi la tua esperienza e le tue idee sulla gestione delle eccezioni nei commenti qui sotto.
- Diffondi la conoscenza condividendo questo articolo con i tuoi colleghi sviluppatori.
- Unisciti all’equipaggio iscrivendoti alla newsletter per ricevere altri emozionanti contenuti su ASP.NET Core!