.net 6 Api Global Exception Handler

6 min read Jun 03, 2024
.net 6 Api Global Exception Handler

Gérer les exceptions globales dans vos API .NET 6

Une des pierres angulaires d'une API robuste est sa capacité à gérer les erreurs de manière élégante et informative. En .NET 6, les développeurs ont la possibilité d'implémenter un gestionnaire d'exceptions global pour traiter les erreurs qui surviennent dans l'ensemble de l'application. Cette approche permet de centraliser la logique de gestion des exceptions et d'assurer une réponse cohérente à toutes les erreurs.

Pourquoi un gestionnaire d'exceptions global ?

Un gestionnaire d'exceptions global offre plusieurs avantages significatifs:

  • Centralisation: Au lieu de gérer les exceptions dans chaque contrôleur, un gestionnaire global simplifie le processus et réduit la répétition de code.
  • Cohérence: Un gestionnaire global garantit que toutes les exceptions sont traitées de manière cohérente, fournissant une expérience utilisateur uniforme.
  • Fiabilité: En interceptant les erreurs, le gestionnaire global peut prévenir des pannes inattendues et assurer la stabilité de l'API.
  • Gestion de la journalisation: Le gestionnaire global peut facilement enregistrer les détails des exceptions pour faciliter le débogage et l'analyse.

Mise en œuvre d'un gestionnaire d'exceptions global

Dans .NET 6, vous pouvez mettre en œuvre un gestionnaire d'exceptions global en utilisant l'attribut [ExceptionFilter]. Voici un exemple de base:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

public class GlobalExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
        // Enregistrez l'exception pour le débogage
        Console.WriteLine($"Une erreur s'est produite: {context.Exception.Message}");

        // Renvoyez une réponse d'erreur au client
        context.Result = new ObjectResult(new
        {
            Message = "Une erreur s'est produite.",
            StatusCode = 500
        })
        {
            StatusCode = 500
        };
    }
}

Dans cet exemple, le filtre GlobalExceptionFilter est enregistré en tant que filtre d'exception global dans Program.cs :

// Dans Program.cs
builder.Services.AddControllers(options =>
{
    options.Filters.Add(typeof(GlobalExceptionFilter));
});

Maintenant, chaque fois qu'une exception se produit dans l'API, le filtre GlobalExceptionFilter est appelé. Le code dans le filtre peut enregistrer l'exception, personnaliser la réponse à l'utilisateur et effectuer d'autres actions nécessaires.

Gérer différents types d'exceptions

Le gestionnaire global peut être utilisé pour traiter différents types d'exceptions de manière spécifique. Vous pouvez utiliser les blocs try et catch pour capturer des types d'exceptions spécifiques et fournir des réponses personnalisées.

// Dans GlobalExceptionFilter
public void OnException(ExceptionContext context)
{
    if (context.Exception is ArgumentException)
    {
        // Gérer une ArgumentException spécifique
        context.Result = new ObjectResult(new
        {
            Message = "Un argument invalide a été fourni.",
            StatusCode = 400
        })
        {
            StatusCode = 400
        };
    } 
    else if (context.Exception is NotFoundException)
    {
        // Gérer une NotFoundException spécifique
        context.Result = new ObjectResult(new
        {
            Message = "La ressource n'a pas été trouvée.",
            StatusCode = 404
        })
        {
            StatusCode = 404
        };
    }
    else
    {
        // Gérer toutes les autres exceptions
        context.Result = new ObjectResult(new
        {
            Message = "Une erreur s'est produite.",
            StatusCode = 500
        })
        {
            StatusCode = 500
        };
    }
}

Enrichir la réponse d'erreur

Vous pouvez enrichir la réponse d'erreur avec des informations supplémentaires, telles que des détails sur l'exception, des conseils pour l'utilisateur, ou un identifiant de requête unique pour la traçabilité.

// Dans GlobalExceptionFilter
context.Result = new ObjectResult(new
{
    Message = "Une erreur s'est produite.",
    StatusCode = 500,
    ErrorDetails = new
    {
        ExceptionType = context.Exception.GetType().FullName,
        ExceptionMessage = context.Exception.Message,
        StackTrace = context.Exception.StackTrace,
        RequestId = Guid.NewGuid() // Identifiant de requête unique
    }
});

Conclusion

Un gestionnaire d'exceptions global est un outil puissant pour améliorer la robustesse et la fiabilité de vos API .NET 6. En centralisant la logique de gestion des exceptions, vous pouvez garantir une réponse cohérente et informative pour toutes les erreurs, améliorer la traçabilité et simplifier la maintenance de votre application.

Related Post