2010-09-14 10 views
6

Ich habe eine OnException-Ausnahme (ExceptionContext filterContext) in meinem Basis-Controller, um die App bei Fehlern abzufangen und sie dann zu protokollieren. Das Problem, das ich in meiner App bekomme, ist, dass diese bestimmte Methode viermal wegen bestimmter Fehler ausgelöst wird. Ich werde Sie durch eine Szenario gehen:Korrekte Fehlerbehandlung in ASP.NET MVC2

Lassen Sie uns sagen, dass ich zu navigieren: http://localhost:180/someController/someAction?someId=XX

Und ich habe schlechte Objekt in meinem Code Handhabung. Die übergebene ID ist ungültig und ruft ein Null-Objekt ab. Ich versuche dann, bc meiner schlechten Objektbehandlung, an einem Null-Objekt zu arbeiten. Ich bekomme eine Ausnahme.

Die OnException von BaseController wird hier ausgelöst.

Dieses Null-Objekt wird immer noch in der Ansicht zurückgegeben, wo die Ansicht versucht, es an etwas zu binden, oder was Sie haben.

BaseControllers OnException wird hier erneut ausgelöst, für den Fehler in der Ansicht.

Im Prinzip ist nur ein Fehler für mich wichtig, aber der Trickle-up-Effekt verursacht mehr Fehler, und spammen meinen Posteingang: - /.

Was ist der richtige Weg, um einen Fehler in MVC2 zu bekommen und nicht mir passiert?

Antwort

0

Zuerst zu erklären, warum Sie mehrere Fehler erhalten. Der erste Fehler besteht darin, dass Sie versuchen, mit einem Null-Objekt in Ihrem Modell oder Controller zu arbeiten. Dann erhalten Sie wahrscheinlich eine zweite Ausnahme, wenn die Ansicht versucht, an ein Null-Objekt zu binden, wenn ein Objekt existiert. Nicht genau, warum Sie 4 Fehler bekommen, aber könnte sein, weil der Code versucht, an einem Objekt zu arbeiten, das momentan null ist.

Mein erster Vorschlag wäre, haben Sie Ihren OnException Code die Anwendung auf eine freundliche Fehlerseite umleiten. Sie nehmen wahrscheinlich nur jede neue Ausnahme auf und lassen die web.config nicht korrekt mit den Fehlerseiten umgehen, wenn Sie diese Einstellung haben, um eine Fehlerseite anzuzeigen.

Mein zweiter Vorschlag wäre, etwas Code hinzuzufügen, um nach Nullobjekten zu suchen, bevor Sie an ihnen arbeiten. Diese werden im Allgemeinen als Guard-Klauseln bezeichnet und sind sehr hilfreich und nützlich zu implementieren. Sie können dann eine nette, freundliche Methode zur Fehlerbehandlung festlegen, ohne immer eine Ausnahme zu protokollieren, wenn Sie neben einem generischen "Ein Fehler ist aufgetreten" auch eine freundliche Nachricht an einen Benutzer anzeigen müssen. Botschaft.

Zum Beispiel in der Controller Sie für ein Null-Objekt überprüfen könnten, und eine alternative Ansicht für den Benutzer übergeben, wenn das Objekt null ist

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 

Ich weiß, das vb ist (Leider weiß ich, dass besser als C#) aber die Idee ist dieselbe. Wenn Sie möchten, können Sie dies immer noch als Fehler protokollieren, aber Sie würden dann verhindern, dass der Fehler viele Male auftritt. Es ist immer eine gute Übung, den Fehler zu behandeln, wenn er auftritt, und versuchen, ihn nicht bis zum Anfang des Stapels treiben zu lassen und mehrere andere Fehler zu verursachen.

Hoffe das hilft, das waren nur meine schnellen Gedanken aus dem Lesen Ihrer Frage.

+0

Vielen Dank für Ihre schnelle Antwort. Ich werde hier etwas klären. Ich habe Schutz um Null-Objekte, wollte nur ein Beispiel für eine Ausnahme geben, die so einfach wie möglich passiert. Auch die Fehlerseite zeigt, wie es sollte, das ist auch kein Problem. Es ist einfach so, dass wenn eine Ausnahme auftritt und zu weiteren Ausnahmen kommt, sie alle protokolliert werden, wenn ich mich nur um die erste kümmere. Ich würde beim ersten Fehler annehmen, die Anwendung würde die Ausführung stoppen, aber das scheint nicht der Fall zu sein. –

1

Ich würde empfehlen, dass Sie vom HandleError-Attribut erben und Ihre Ausnahmebehandlung dort einrollen. Das Überschreiben der OnException auf einem einzelnen Controller bedeutet, dass Sie auf vielen Controllern entweder viel Code für die Ausnahmebehandlung haben oder dass Sie von einem Basis-Code erben, der in beiden Fällen aufgrund der MVC-Pipeline nicht unbedingt erforderlich ist.

Wenn Sie das Attribut verwenden, sollte pro Aktion ein Fehler auftreten. Sobald der Fehler behoben ist, wird er nicht erneut ausgelöst. Hoffentlich wird dies bei wiederholten Ausnahmebefehlen weniger machen.

Ich persönlich verwende Attribute für die Ausnahmebehandlung, weil es sauberer und wiederverwendbarer ist und eine Menge Lärm in meinen Aktionen loswird.

+0

Das ist gut, ich mag diesen Ansatz, jedoch stoße ich immer noch auf das gleiche Problem der Anfrage, die immer noch versucht, das zu beenden Ausführung, und sprudeln bis zu Teilansichten und Ansichten, Fehler bei jedem von ihnen zu erstellen. Dies ist die Ausnahme, die ich in den Ansichten bekomme (die erste Ausnahme, die ich protokollieren möchte, passiert im Controller): Fehler beim Ausführen der untergeordneten Anforderung für den Handler 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper'. –

Verwandte Themen