.NET Core & Exceptions

September 24, 2020 Yves Nicol .Net Core 1 minute, 28 secondes

Automatiser la gestion d'exception en .NET Core

Ceci est réalisé via l'utilisation de filtre qui permet d'executer du code avant certaines étapes du cycle de vie d'execution d'une requête. Exemple le filtre [authorize] pour vérifier un utilisateur authentifié.

Création d'une exception

public  class  EntityNotFoundException : Exception
{
    public  EntityNotFoundException ( nom de chaîne  , clé d' objet ) 
        : base ( $ "L' entité '{ name }' ({ key }) est introuvable. " )
    {
    }
}

Déclarer l'exception à l'intérieur d'une fonction d'un service :
 MyObject  public GetById ( int  id )
{
    var  obj  =  _list. FirstOrDefault ( x  =>  x . Id  ==  id );

    if ( obj  ==  null )
    {
        throw  new  EntityNotFoundException ( nameof ( MyObject ), id );
    }

    return obj;
}

L'exception doit être traitée à un autre niveau de votre application (try...catch).

Implémenter le filtre pour les exceptions

Pour automatiser la gestion des exceptions, il faut donc surcharger l'implémentation de OnException dans une implémentation personnalisée de ExceptionFilterAttribute :

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        var statusCode = HttpStatusCode.InternalServerError;

        if (context.Exception is EntityNotFoundException)
        {
            statusCode = HttpStatusCode.NotFound;
        }

        context.HttpContext.Response.ContentType = "application/json";
        context.HttpContext.Response.StatusCode = (int) code;
        context.Result = new JsonResult(new
        {
            error = new[] { context.Exception.Message },
            stackTrace = context.Exception.StackTrace
        });
    }
}

Le code déclaré au dessus permet de générer un code HTTP 404 sur une exception personnalisée dans votre code. A chque exception de type EntityNotFoundException, le code 404 sera renvoyé dans le contexte de réponse de la requête avec le message d'erreur.

Afin de finaliser la configuration de votre projet .NET Core il faut déclarer le filtre dans "startup.cs" :

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => options.Filters.Add(typeof(ExceptionFilter)))
        .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

    services.AddScoped<IMyService, MyService>();
}

source de lecture sur medium.com