2009-07-02 11 views
5

Ich bin mir nicht sicher, was den Unterschied zwischen den verschiedenen Möglichkeiten zu HandleError.Ich brauche mehr Informationen über HandleError

In der asp.net Mvc (Standardprojekt) sie dies der Klasse ganz oben in der

[Handle]

So war ich einige Blog zu lesen und die Person sagt, das

“. ... teilt dem Framework mit, dass wenn eine unbehandelte Ausnahme in Ihrem Controller auftritt, anstatt den gelben Standardbildschirm des Todes anzuzeigen, sollte stattdessen eine Ansicht namens Fehler angezeigt werden. "

http://blog.dantup.me.uk/2009/04/aspnet-mvc-handleerror-attribute-custom.html

Also das bedeutet, ich sollte keine Fehler werden zu kontrollieren (dh keine try Fänge)? sie setzen es nur auf dieser Action und geben ihm eine Ausnahmetyp

ich dann in einem Buch gesucht und sie haben

[HandleError(ExceptionType=typeof(InsufficientMemoryException),View="About")] 
public ActionResult HandleError() 
{ 
    throw new 
InsufficientMemoryException(); 
    return View("Home"); 
} 

So. Meine erste Frage ist, was passiert, wenn Sie mehr als einen Fehler haben, den Sie werfen? Auch ich dachte, du solltest mit allen Fehlern umgehen. Ich weiß, das ist nur ein kleines Beispiel, aber sollten Sie die MemoryException nicht irgendwo finden oder mischt das "HandleError", wenn Sie das tun?

Ich bemerkte auch, während es in VS, dass HandleError hat 2 Überlastungsmethoden. Einer von ihnen ist der obige und der andere ist HandError().

Also warum ist in der asp.net MVC Beispieldatei nur [HandleError] und nicht [HandleError()]? Wird eines für Aktionsmethoden und eines für Klassen verwendet? Ich gehe davon aus, dass HandleError am Anfang der Klasse 1 wäre wie HandleError (typeof (Exception))?

und schließlich gibt es etwas namens IExceptionFilter. Sie verwenden das also, wenn Sie alle Ausnahmen protokollieren wollen oder wenn Sie spezielle Ausnahmen haben, mit denen Sie etwas anders machen möchten?

Wie wenn ich nur alle Ausnahmen protokollieren wollte, egal was ich machen würde nur eine von diesen und das ist es, aber wenn ich etwas Besonderes bei einer NullReferenceexception machen wollte, würde ich eine andere machen?

Ich beobachtete dieses Tutorial http://dimecasts.net/Casts/CastDetails/37 und ich sehe dieses "ActionFilterAttribute" nicht, über das sie sprechen. Ist das von einer alten Version oder etwas?

Wie anscheinend hat es 4 Methoden, die Sie verwenden können, und Sie müssen sie überschreiben. In meinem Buch es nur Gespräche über diese:

  1. IAuthorizationFilter
  2. IActionFilter
  3. IResultFilter
  4. IExceptionFilter

und sie sind alle Schnittstellen so kein überwiegendes. Nicht von ihnen haben jedoch 4 Methoden. Nur ein oder 2.

Dank

Oh eine weitere Sache. Sollten Sie immer auf jede einzelne Ausnahme testen?Wie eine meiner Methoden kann 7 verschiedene Ausnahmen auftreten. Sollte ich für alle 7 Ausnahmen testen (dh sie werfen), dann fangen Sie sie schließlich und behandeln Sie sie (ich drucke normalerweise nur einige Nachrichten aus).

Wenn ja, hat VS2008 etwas, das die Ausnahmen findet, die passieren können. Manchmal fällt es mir schwer zu sagen, was eine Ausnahme auslösen kann, dann muss ich herausfinden, welche.

Antwort

2

"Nie" Trap System.Exception. Sie könnten ein Problem verbergen. Besser, "Fail Fail".

Nur Falle Ausnahmen:

  • Sie wissen, können auftreten und
  • , die Sie von anmutig erholen und
  • , dass Sie nicht präventiv können überprüfen, für

So Um Ihre letzte Gruppe von Fragen zu beantworten, würde ich diese Ausnahmen nicht abfangen, wenn Sie nach den Bedingungen im Code suchen können. Wenn beispielsweise FileNotFound einer von ihnen ist, suchen Sie nicht nach FileNotFoundException, sondern nach der Datei. Wenn NullReference eins ist, überprüfen Sie, ob das Objekt null ist, anstatt die Ausnahme abzufangen.

Andrew's Vorschlag, ELMAH für die Protokollierung unbehandelter Ausnahmen oder irgendeine Ausnahme für diese Angelegenheit zu verwenden, ist eine großartige, IMO.

2

Die größte Sache ist, dass Sie immer Fehler auffangen sollten, von denen Sie wissen, dass sie auftreten könnten. Als nächstes sollten Sie nicht versuchen, jeden einzelnen Fehler, der dem Benutzer bekannt ist, zu erfassen ... Sie könnten den ganzen Tag in Ihrem Code sein und solche Dinge hinzufügen. Das [HandleError] -Attribut ist im Wesentlichen ein globaler Fehlerhandler, der sagt, wenn ein Fehler in diesem Controller auftritt, sendet er sie an die konfigurierte Seite. Das ist schön, da Sie alle Fehler sofort auspacken! Die nächste Sache ist die Behandlung eines spezifischen Fehlers in einer bestimmten Art und Weise. Sie können sagen, wenn ein XYZ-Fehler auftritt, gehen Sie auf diese Seite anstelle der global behandelten Fehlerseite. Wenn mehrere Fehler auftreten ... gewinnt der erste. Das bedeutet, wenn Sie beabsichtigen, zwei Arten von Fehlern zu erfassen ... welche auch immer zuerst auftritt, wird auch steuern, auf welche Seite Sie weitergeleitet werden.

Das nächste, was Sie für jede asp.net-Website (Webforms oder MVC) berücksichtigen könnten, ist das ELMAH-Framework. Es protokolliert und erfasst jeden einzelnen Fehler, den Ihre Site verursacht. Dies wird Ihnen helfen, Fehler zu beheben, die Ihnen nicht bekannt sind ... damit Sie nicht alle im Voraus planen müssen. Das Schöne an diesem Framework ist, dass Sie eine E-Mail senden können, wenn ein Fehler auftritt, sowie eine XML-Datei (neben anderen Konfigurationsmöglichkeiten). Sehr praktisch!

Ich hoffe, ich habe alle Ihre Fragen gerichtet!

+1

Hmm also Handle Fehler ist, wenn Sie eine generische Seiten für alle Fehler wollen? Wenn Sie genauere Fehler möchten, dann setzen Sie es über die actionView? Wie wäre es mit "IExceptionFilter" wann würde ich dieses verwenden? Wäre dies der Ort, an dem ich mein Logging-Zeug (oder Elmah-Code) wäre? Auch ich bin mir immer noch nicht sicher, wie der Code aussieht? Behandle ich die Fehler nicht (try/catch) oder behandle ich sie trotzdem? Ich bin nicht klar, ob ich mit ihnen umgehen würde, wenn das [HandleError] verwirrt. Auch wenn ich sie handhabe wird das ELMAH-Framework nicht davon abhalten, Sachen auf gehandhabten Ausnahmen zu tun? Dh ich müsste bekannte manuell protokollieren? – chobo2

Verwandte Themen