.NET Core & Exceptions
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