2010-09-14 8 views
6

J'ai une exception OnException (ExceptionContext filterContext) dans mon contrôleur de base pour intercepter l'application pendant toute erreur, puis les enregistrer. Le problème que je reçois dans mon application est cette méthode particulière est déclenchée quatre fois pour certaines erreurs. Je vais vous guider à travers un scénario:Traitement correct des erreurs dans ASP.NET MVC2

Disons que j'accédez à: http://localhost:180/someController/someAction?someId=XX

Et je pauvre objet de manipulation dans mon code. L'Id passé est invalide, et il récupère un objet nul, alors je, bc de ma mauvaise gestion d'objet, essaie de fonctionner sur un objet nul. J'ai une exception.

La fonction OnException de BaseController est déclenchée ici.

Cet objet nul est toujours retourné à la vue, où la vue tente de le lier à quelque chose, ou quoi que ce soit.

La fonction OnException de BaseController est renvoyée ici pour l'erreur dans la vue. Pour l'essentiel, une seule erreur est importante pour moi, mais l'effet de retombée provoque plus d'erreurs, et spamme ma boîte de réception: - /.

Quelle est la bonne façon d'intercepter une erreur dans MVC2 et de ne pas me l'arriver?

Répondre

0

D'abord pour expliquer pourquoi vous obtenez plusieurs erreurs. La première erreur sera d'essayer d'opérer sur un objet nul très probablement dans votre modèle ou votre contrôleur. Vous obtenez alors probablement une 2ème exception lorsque la vue tente de se lier à un objet nul lorsqu'elle s'attend à ce qu'un objet existe. Pas exactement sûr pourquoi vous obtenez 4 erreurs mais pourrait être parce que le code essaye d'opérer sur un objet qui est actuellement nul.

Ma première suggestion serait que votre code OnException redirige l'application vers une page d'erreur amicale. Vous êtes probablement en train de manger chaque nouvelle exception et de ne pas laisser le web.config gérer correctement les pages d'erreur si vous avez cette configuration pour afficher une page d'erreur.

Ma deuxième suggestion serait d'ajouter du code pour vérifier les objets NULL avant de les utiliser. Ceux-ci sont communément appelés clauses de garde, et sont très utiles et utiles à mettre en œuvre. Vous pouvez ensuite déterminer une façon agréable et conviviale de gérer les erreurs sans toujours enregistrer une exception si vous n'en avez pas besoin et afficher un message convivial à un utilisateur en plus d'un message générique "Une erreur est survenue". message.

Par exemple, dans votre contrôleur, vous pouvez vérifier pour un objet nul et passer un autre point de vue à l'utilisateur si cet objet est nul

Function Example As ActionResult 

    dim obj as Object = GetObject 

    If obj is Nothing Then 

     Return View("FriendlyNoObjectView") 

    Else 

     Return View(obj) 

    End If 

End Function 

Je sais que cela vb (Désolé, je sais mieux alors C#) mais l'idée est la même. Si vous le souhaitez, vous pouvez toujours enregistrer cette erreur comme une erreur, mais vous éviterez alors l'erreur plusieurs fois. C'est toujours une bonne pratique de gérer l'erreur quand elle se produit et essayez de ne pas laisser flotter tout le chemin vers le haut de la pile et provoquer plusieurs autres erreurs.

Espérons que cela aide ces derniers étaient juste mes pensées rapides de la lecture de votre question.

+0

Nous vous remercions de votre réponse rapide. Je vais clarifier quelque chose ici .. J'ai une protection autour des objets nuls, je voulais juste donner un exemple d'une exception qui se passe le plus facilement possible. En outre, la page d'erreur montre comme il se doit, ce n'est pas un problème non plus. C'est simplement que lorsqu'une exception survient, et qu'elle s'égoutte pour provoquer d'autres exceptions, ils sont tous enregistrés, quand je me soucie seulement du premier. Je supposerais sur la première erreur, l'application arrêterait l'exécution, mais cela ne semble pas être le cas .. –

1

Je vous recommande d'hériter de l'attribut HandleError et d'y déployer votre gestion des exceptions. Le remplacement de l'exception OnException sur un seul contrôleur signifie que vous avez beaucoup de code de gestion des exceptions dans beaucoup de contrôleurs ou que vous héritez d'un contrôleur de base, ce qui n'est pas vraiment nécessaire dans les deux cas en raison du pipeline MVC.En utilisant l'attribut, vous devriez avoir une occurrence d'erreur par action exécutée, et une fois l'erreur traitée, elle ne se déclenchera plus. Espérons que cela permettra de réduire les messages d'exception de répétition.

Personnellement, j'utilise des attributs pour la gestion des exceptions car il est plus propre et plus réutilisable et se débarrasse de beaucoup de bruit dans mes actions.

+0

C'est bon, j'aime cette approche, cependant, je rencontre toujours le même problème de la demande essayant toujours de finir le exécution, et bouillonner jusqu'à des vues partielles, et des vues, en créant des erreurs sur chacun d'eux. c'est l'exception que je reçois sur les vues (la première exception, celle que je veux enregistrer, arrive dans le contrôleur): Erreur lors de l'exécution de la requête enfant pour le gestionnaire 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'. –