Utilisation de l’Attribut HandleError dans Asp.net MVC

erreur-404

Je vais vous présenter dans cet article l'utilisation de l'attribut HandleError dans Asp.net MVC, et j'en profiterai aussi pour vous parler de la gestion d'erreur personnalisée dans une application MVC.

La gestion d'erreur dans une application MVC a pour but d'afficher des pages d'erreur compréhensibles par les utilisateurs finaux et cela évite également l'affichage des pages avec du code qui peut être utilisé par des hackers.

Pour activer la gestion des erreurs personnalisées, il faut suivre les étapes suivantes :

  • Etape 1 :  modifier le fichier web.config en mettant l'attribut customerError qui se trouve sous <system.web> à On:
<customerErrors mode="On">
</customerErrors >
  • Etape 2 : ajouter une vue Errors.cshtml dans le dossier Shared

Et c'est tout. Normalement avec ça, à chaque fois qu'une exception survient, la page Error.cshtml est affichée.

Comment fonctionne tout ça ? Dans le ficher Global.asax on appelle la méthode RegisterGlobalFilter qui ajoute un filtre global appliqué sur tous les contrôleurs. Ce filtre crée l'attribut HandelErrorAttribute.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}

A chaque fois qu'il y a une exception, le filtre est activé et le HandelErrorAttribute s'applique sur toutes les actions des contrôleurs et se charge pour afficher la page Errors.cshtml dans le dossier Shared.

Dans le cas où l'on veut que l'attribut HandelErrorAttribute ne soit pas appliqué sur toutes les actions méthodes des contrôleurs, il suffît de commenter la ligne filters.Add(new HandleErrorAttribute()); de la méthode  RegisterGlobalFilters, et d'ajouter l'attribut [HandelError] au-dessus de l'action méthode voulue. Par exemple :

Considérons un contrôleur qui contient deux méthodes : une décorée par l'attribut [HandelError] et l'autre non.

[HandelError]
public ActionResult Index()
{
    throw new Exception("Une exception est générée ");
}
public ActionResult affiche()
{
    throw new Exception("Une exception est générée");
}

Si on appelle la méthode index,  alors c'est la page error.cshtml qui s’affiche. Cependant si on appelle la méthode affiche alors la page par défaut d'erreur est affichée.

Revenons maintenant à la gestion globale des erreurs. Dans ce cas, nous n'avons pas besoin de spécifier l'attribut  [HandelError]  sur les méthodes d'actions. Jusqu'à maintenant on traite uniquement les erreurs  qui viennent des méthodes d'actions définies dans les contrôleurs. Si nous essayons d'appeler une méthode qui n'est pas définie dans les contrôleurs,  une erreur 404 par défaut est affichée, cela est normal car le HandelErrorAttribute s'applique seulement sur les méthodes définies dans l'application. Comment peut-on remédier à ce problème et afficher une page d'erreur personnalisée ?

Trois étapes sont nécessaires pour faire ça :

  • Ajouter le contrôleur ErrorController:
public class ErrorController : Controller
{
    public ActionResult NotFound()
    {
        return View();
    }
}
  • Ajouter la vue NotFound.cshtml dans le dossier Shared
  • Modifier l'attribut customError en ajoutant  la redirection vers la page d'erreur NotFound.cshtml
<customErrors mode="On">
  <error statusCode="404" redirect="~/Error/NotFound"/>
</customErrors> 

Et c'est tout. Avec ça, on résout le problème des erreurs 404. On peut également utiliser cette technique pour personnaliser les vues par code erreur comme par exemple une vue pour erreur 500 ...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.