2009-04-05 10 views
11

Je tente d'implémenter la gestion des erreurs globales dans mon application MVC.MVC Gestion des erreurs globales: Application_Error ne déclenche pas

J'ai une certaine logique à l'intérieur de mon Application_Error qui redirige vers un ErrorController mais cela ne fonctionne pas. J'ai un point de rupture dans ma méthode Application_Error dans le Global.aspx.

Lorsque je force une exception, le point d'arrêt n'est pas atteint. Des idées pourquoi?

+0

Avez-vous essayé d'exécuter une application en mode non-débogage? CTR + F5 –

+0

Votre méthode a-t-elle la bonne signature? Application_Error (expéditeur d'objet, EventArgs e) et non Application_Error()? –

+0

est présent dans votre web.config? –

Répondre

10

Vous pouvez essayer cette approche pour le test:

protected void Application_Error(object sender, EventArgs e) 
{ 
    var error = Server.GetLastError(); 
    Server.ClearError(); 
    Response.ContentType = "text/plain"; 
    Response.Write(error ?? (object) "unknown"); 
    Response.End(); 
} 

Web.config

<customErrors mode="Off" /> 
+0

Non! C'est une mauvaise idée. Je veux la gestion globale des erreurs, pour enregistrer l'erreur et présenter un écran convivial à l'utilisateur. – Dan

+0

Vos liens ne sont pas vraiment pertinents à ma question. – Dan

+2

@Dan, tu n'as pas compris. Le débogueur ne peut tout simplement pas entrer dans votre méthode Application_Error. Utilisez mon code sans débogueur et vous verrez que cela fonctionne. BTW, vous battre n'importe quel désir de vous aider. –

0

Je ne peux pas vous dire à coup sûr quelle' Je me trompe, mais je peux penser à un certain nombre de choses à vérifier ... d'abord, est-ce que VS brise l'exception? Si vous êtes dans le débogueur c'est la valeur par défaut je pense. Si c'est juste appuyez sur F5 jusqu'à ce que vous arriviez à votre code avec le point d'arrêt. Aussi, êtes-vous sûr de ne pas gérer l'exception n'importe où avant d'arriver à Application_Error?

Une autre chose à vérifier - CustomErrors mode dans web.config, cela est mis à Off, non?

+0

Non ne pas le gérer ailleurs, juste obtenir une page d'erreur standard asp.net disgracieux. – Dan

+0

OK merci, a ajouté une autre pensée à mon poste. –

2

Je pense qu'une meilleure façon de gérer cela serait d'utiliser le HandleErrorAttribute pour décorer votre contrôleur (peut-être un contrôleur de base). Cela vous donnerait la possibilité de faire de la journalisation ou de gérer les erreurs dans différents contrôleurs avec des erreurs différentes en étendant cet attribut et en le modifiant pour répondre à vos besoins, disons en changeant la vue qui est rendue. L'utilisation de cet attribut utilise le traitement de filtre standard dans MVC et construit la page en utilisant des vues plutôt que d'écrire directement dans la réponse, comme vous le feriez avec Application_Error.

+2

L'utilisation de l'attribut HandleError n'aide pas les erreurs qui se produisent en dehors des contrôleurs autant que je peux dire (par exemple dans RegisterRoutes dans Global.asax.cs). –

+2

@Michael - true, cela s'applique uniquement à un contrôleur ou à une méthode de contrôleur car la structure ne reconnaît que les attributs. En pratique, je ne trouve pas cela comme un problème. Pour moi, le seul code qui s'exécute en dehors d'une action est fait au démarrage.J'utilise ELMAH avec un attribut HandleError personnalisé de toute façon, donc mes deux bases sont couvertes. – tvanfosson

+0

@tvanfosson même pour les appels ajax, aussi. Il va directement au global.asax application_error si vous l'avez ... après quelques recherches et tests, j'ai décidé d'une solution à trois volets. A. attribut personnalisé à l'aide RegisterGlobalFilters pas les contrôleurs décorés B. Mise à jour web.config pour transformer la gestion des erreurs personnalisée sur C. JavaScript qui capture tous les messages, que ce soit à l'aide du modèle et une méthode d'assistance ou directement à partir du code d'état ajax et une redirection vers la page d'erreur via javaScript où le modèle et l'ajax entonnent leur erreur dans – Clarence