Gestione delle Eccezioni in .NET Core con IExceptionHandler

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<GlobalExceptionHandler> logger) : IExceptionHandler
{
    public async ValueTask<bool> 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<GlobalExceptionHandler>();
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!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Skip to content