2009-04-05 11 views
11

Ich versuche, globale Fehlerbehandlung in meiner MVC-Anwendung zu implementieren.MVC Globale Fehlerbehandlung: Application_Error nicht feuern

Ich habe eine Logik in meinem Application_Error, die zu einem ErrorController umleitet, aber es funktioniert nicht.

Ich habe einen Breakpoint innerhalb meiner Application_Error Methode in der Global.aspx.

Wenn ich eine Ausnahme erzwinge, wird der Haltepunkt nicht getroffen. Irgendwelche Ideen warum?

+0

Haben Sie versucht, die Anwendung im Nicht-Debug-Modus auszuführen? CTR + F5 –

+0

Hat Ihre Methode die richtige Signatur? Application_Error (Objekt Absender, EventArgs e) und nicht Application_Error()? –

+0

ist in Ihrer web.config vorhanden? –

Antwort

10

können Sie versuchen, diesen Ansatz für die Prüfung:

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

Nein! Das ist eine schlechte Idee. Ich möchte die globale Fehlerbehandlung, um den Fehler zu protokollieren und dem Benutzer einen freundlichen Bildschirm zu präsentieren. – Dan

+0

Ihre Links sind nicht wirklich relevant für meine Frage. – Dan

+2

@Dan, du hast meinen Standpunkt nicht verstanden. Der Debugger kann einfach nicht in Ihre Application_Error-Methode wechseln. Verwenden Sie meinen Code ohne Debugger und Sie werden sehen, dass es funktioniert. BTW, du hast jeden Desier geschlagen, um dir zu helfen. –

0

Ich kann Ihnen nicht sagen, sicher Was' s falsch, aber ich denke an ein paar Dinge zu überprüfen ... Erstens, bricht VS auf die Ausnahme? Wenn Sie im Debugger sind, ist dies der Standard, denke ich. Wenn es nur F5 gedrückt wird, bis Sie zu Ihrem Code mit dem Haltepunkt gelangen. Sind Sie sicher, dass Sie die Ausnahme nirgendwo behandeln, bevor sie Application_Error erreicht?

Eine andere Sache zu überprüfen - CustomErrors Modus in web.config, dies ist auf Off, richtig eingestellt?

+0

Nein, behandeln Sie es nicht woanders, ich bekomme gerade eine unverschämte Standard asp.net Fehlerseite. – Dan

+0

OK danke, fügte meinem Beitrag einen weiteren Gedanken hinzu. –

2

Ich denke, ein besserer Weg, um dies zu handhaben wäre die Verwendung der HandleErrorAttribute, um Ihren Controller (vielleicht eine Basis-Controller) zu dekorieren. Dies bietet Ihnen die Möglichkeit, Fehler in verschiedenen Controllern mit unterschiedlichen Fehlern zu protokollieren oder zu behandeln, indem Sie dieses Attribut erweitern und an Ihre Anforderungen anpassen, indem Sie beispielsweise die Ansicht ändern, die gerendert wird. Bei Verwendung dieses Attributs wird die Standardfilterverarbeitung in MVC verwendet und die Seite wird mithilfe von Sichten erstellt, anstatt direkt in die Antwort zu schreiben, wie Sie es möglicherweise mit Application_Error tun.

+2

Die Verwendung des HandleError-Attributs hilft nicht bei Fehlern, die außerhalb von Controllern auftreten, soweit ich das feststellen kann (zum Beispiel in RegisterRoutes in Global.asax.cs). –

+2

@Michael - richtig, es gilt nur für eine Controller- oder Controller-Methode, da das Framework dort nur die Attribute erkennt. In der Praxis halte ich das nicht für ein Problem. Für mich ist der einzige Code, der außerhalb einer Aktion ausgeführt wird, beim Start ausgeführt.Ich benutze ELMAH sowieso mit einem benutzerdefinierten HandleError-Attribut, so dass beide Basen abgedeckt sind. – tvanfosson

+0

@tvanfosson das gleiche für Ajax Anrufe, auch. Es geht direkt zum global.asax application_error, wenn Sie es haben ... nach einigen Recherchen und Tests habe ich mich für eine Three-Prong-Lösung entschieden. A. benutzerdefinierte Attribut RegisterGlobalFilters nicht eingerichtet Controller B. Aktualisieren web.config mit benutzerdefinierten Fehler aktivieren C. JavaScript Handhabung, die alle Nachrichten erfasst, entweder das Modell und eine Hilfsmethode oder direkt von der Ajax-Statuscode und eine Umleitung auf die Fehlerseite über javaScript, in die das Modell und der Ajax ihren Fehler einleiten – Clarence

Verwandte Themen