ASP.Net MVC-Ausnahmeprotokollierung kombiniert mit Fehlerbehandlung
Ich bin auf der Suche nach einer einfachen Lösung zu tun Ausnahme der Protokollierung kombiniert mit der Fehlerbehandlung in mein ASP.Net MVC 1.0 Anwendung.
Ich habe gelesen, viele Artikel, einschließlich der Fragen, die hier gepostet auf StackOverflow, die alle bieten verschiedene Lösungen für verschiedene Situationen. Ich bin noch nicht in der Lage zu kommen mit einer Lösung, die passt meine Bedürfnisse.
Hier sind meine Anforderungen:
-
Nutzen zu können [HandleError] - Attribut (oder etwas äquivalentes) auf meinem Controller, um alle exceptions, die geworfen werden konnte aus irgendwelchen Handlungen oder Ansichten. Dies sollte behandeln alle Ausnahmen, die wurden nicht bearbeitet, die speziell auf die Aktionen (wie beschrieben in Punkt 2). Ich möchte in der Lage sein, um anzugeben, welche Ansicht muss der Benutzer umgeleitet werden, um bei Fehlern, die für alle Aktionen im Controller.
-
Ich möchte in der Lage sein anzugeben [HandleError] - Attribut (oder etwas gleichwertiges) an der Spitze der spezifischen Maßnahmen, zu fangen spezifische Ausnahmen und umleiten von Benutzern auf einen Blick geeignet, um die Ausnahme. Alle anderen Ausnahmen muss immer noch behandelt werden, indem Sie die [HandleError] - Attribut auf dem Controller.
-
In beiden Fällen oben, ich will die Ausnahmen werden protokolliert, mit log4net (oder beliebigen anderen logging-Bibliothek).
Wie gehe ich über die Erreichung der oben genannten? Hab ich überlesen, dass alle meine Controller Erben von einem Basis-controller überschrieben OnException-Methode, und worin ich meine Anmeldung. Dies ist allerdings Durcheinander durch umleiten von Benutzern an die entsprechenden Aussicht, oder machen es chaotisch.
Ich gelesen habe zu schreiben, meine eigenen Filter-Aktion, die implementiert IExceptionFilter um dies zu umgehen, aber dies zu einem Konflikt mit der [HandleError] - Attribut.
So weit, meine Gedanken sind, dass die beste Lösung ist, um zu schreiben, meine eigenen Attribut erbt HandleErrorAttribute. So bekomme ich alle die Funktionalität von [HandleError], und kann hinzufügen, meine eigene log4net-logging. Die Lösung ist wie folgt:
public class HandleErrorsAttribute: HandleErrorAttribute {
private log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception != null)
{
log.Error("Error in Controller", filterContext.Exception);
}
base.OnException(filterContext);
}
}
Wird der obige code funktioniert für meine Anforderungen? Wenn nicht, welche Lösung erfüllt meine Anforderungen?
InformationsquelleAutor der Frage Saajid Ismail | 2009-06-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin noch ein bisschen verwirrt mit all den verschiedenen Lösungen gibt, und wie die Attribute können sich gegenseitig stören, aber ich ging mit dieser Lösung:
Benutze ich immer noch die [HandleError] - Attribut, wie in der ursprünglichen Frage, und ich nur schmücken Sie jeden controller mit einem [LogErrors] - Attribut.
Dies funktioniert für mich, als es hält die Fehlerprotokollierung in einem Ort und nicht zu duplizieren Ausnahmen protokolliert werden mehrere Male (was passiert, wenn ich verlängern [HandleError] und verwenden Sie das Attribut an mehreren stellen).
Ich glaube nicht, es wird möglich sein, beide miteinander zu kombinieren Ausnahme Logging und Fehlerbehandlung in einem atrribute oder Klasse, ohne es immer sehr langwierig und Komplex ist, oder die den Gebrauch von [HandleError]
Aber das funktioniert für mich, da ich dekorieren jeden controller nur einmal mit der [LogErrors] - Attribut, und schmücken Controller und Aktionen mit [HandleError] genau so, wie ich will, ohne dass Sie einander stören.
Update:
Hier ist ein Beispiel, Wie ich es verwenden:
In dem obigen code, SmtpExceptions in der
ContactForm
Aktion überlastung behandelt werden, auf eine sehr spezifische Art und Weise - dem Benutzer präsentiert sich mit einer ViewPage spezifisch für gesendete Nachrichten ist fehlgeschlagen, in diesem Fall heißt es "MessageFailed" . Alle anderen Ausnahmen behandelt werden, die durch das default-Verhalten von [HandleError]. Beachten Sie auch, dass die Protokollierung der Fehler tritt auf, gefolgt von Umgang mit Fehlern. Dies ist im folgenden angegeben:Update:
Gibt es eine alternative Lösung, mit einer sehr guten explanantion. Ich empfehle die Lektüre über es, um ein besseres Verständnis der Probleme beteiligt.
ASP.NET MVC HandleError-Attribut, Benutzerdefinierte Fehlerseiten und Protokollierung von Ausnahmen
(Dank an Scott Shepherd unten, die den link in einer Antwort weiter unten).
InformationsquelleAutor der Antwort Saajid Ismail