34 votes

Traitement des erreurs dans asp.net mvc 3

Est-il intégré ou une bonne façon de gérer les erreurs dans asp.net mvc 3?

C'est ce que je veux faire:

  1. Si l'application se bloque, ou renvoie une erreur, il va à une page d'erreur.
  2. Je peux lancer ma propre erreur du contrôleur de l'action. (et il va vers une page d'erreur).

J'ai trouvé l'une des manières suivantes:

  1. Je vois qu'il ya un long chemin à faire ici. (pour la v1 et la v2, mais aussi s'applique à la v3).
  2. À l'aide de errorhandle attribut ici.

Comment dois-je traiter ce la bonne façon?

Si la solution est similaire ou c'est comme n ° 1 dans la liste ci-dessus, je suis en utilisant ninject et je n'ai pas créé une classe de base. Comment dois-je encore le faire?

15voto

Jerad Rose Points 5960

Je suggère la mise en œuvre d'une coutume HandleErrorAttribute action du filtre.

Voir ce lien pour plus de détails:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

La configuration d'un HandleErrorAttribute action de filtre vous donne un contrôle complet sur les actions qui sont traitées par le filtre, et il est facile de mettre à niveau du contrôleur, ou même au niveau du site par la mise en place sur une base personnalisé contrôleur, et d'avoir tous vos contrôleurs de hériter du contrôleur de base.

Ai autre chose à faire avec cela, c'est que j'ai séparé HandleJsonErrorAttribute qui répond à des appels Ajax, en retournant une réponse Json, plutôt que la page personnalisée.

Mise à JOUR:

Par quelques questions ci-dessous, voici un exemple d'un HandleJsonErrorAttribute que j'utilise:

public class HandleJsonErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        var serviceException = filterContext.Exception as ServiceException;

        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } };

        filterContext.ExceptionHandled = true;
    }
}

Et voici le jQuery que j'utilise pour gérer ces unhanded exceptions:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
    showPopdown($.parseJSON(jqXHR.responseText).message);
});

Ce qui permet à mon Ajax méthodes pour être très léger -- ils gérer le retour normal Json, et dans le cas d'une unhanded exception, un message w/ un code d'état d'erreur s'amalgament en Json et retourné.

Aussi, dans mon application, j'ai une coutume ServiceException que je jette de services, et cela envoie le message à partir de la couche de service au lieu d'un message générique.

14voto

Sunil Points 1375

Mondial De La Gestion D'Erreur
Tout ce que vous avez à faire est de changer le mode customErrors="On" dans le web.la page de configuration
D'erreur sera affiché par Erreur.cshtml réside dans le dossier partagé.

Assurez-vous que l'Erreur.cshtml Mise en page n'est pas nulle.
[Il doit être quelque chose comme: @{ Layout = "~/Views/Shared/_Layout.cshtml"; }
Ou supprimer la Mise en page=null bloc de code]
Un exemple de balisage pour l'Erreur.cshtml:-

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

@model System.Web.Mvc.HandleErrorInfo

<!DOCTYPE html>
<html>
<head>
    <title>Error</title>
</head>
<body>
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
    <p>Controller Name: @Model.ControllerName</p>
    <p>Action Name : @Model.ActionName</p>
    <p>Message: @Model.Exception.Message</p>
</body>
</html>

Spécifique Pour La Gestion Des Erreurs
Ajouter HandleError attribut action spécifique en classe de contrôleur. Fournir "Affichage" et "ExceptionType" pour cette erreur spécifique.
Un échantillon NotImplemented Gestionnaire d'Exception:

public class MyController: Controller
    {
        [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))]
        public ActionResult Index()
        {
            throw new NotImplementedException("This method is not implemented.");
            return View();
        }
}

4voto

VinTem Points 1114

Le moyen le plus simple de le faire consiste à utiliser la bibliothèque elmah.

Jetez un coup d'oeil à ceci: http://code.google.com/p/elmah/wiki/MVC et ceci http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

2voto

Tien Do Points 1262

Je pense que le moyen le plus simple consiste à utiliser l'attribut ExceptionHandler, car il est prêt à être utilisé chaque fois que vous créez un nouveau projet ASP.NET MVC 3. Vous pouvez toujours configurer Web.config pour utiliser une page d'erreur personnalisée et gérer les exceptions dans la méthode globale Application_Error comme d'habitude, mais lorsqu'une exception se produit, l'URL ne s'affiche pas aussi bien que le nouveau chemin de MVC 3.

1voto

pravin Points 215

vous pouvez créer une exception personnalisée dans MVC si vous souhaitez personnaliser un moyen de gestion des exceptions. vous pouvez trouver un post utile ici. http://www.professionals-helpdesk.com/2012/07/creating-custom-exception-filter-in-mvc.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X