Ich protokolliere Fehler in meinen Aktionen mit NLog, um Fehler mit zusätzlichen Informationen zu speichern, zum Beispiel:
%Vor%Und ich habe Fehlerbehandlung in Web.config konfiguriert:
%Vor%Aber ich werde nicht zu Error.cshtml weitergeleitet, wenn ich die Aktion ausführe (die Seite bleibt am selben Ort), warum?
Kann ich Elmah benutzen, um das Gleiche zu tun? (zusätzliche Informationen wie Client-ID protokollieren)
Zuallererst lösen die meisten Leute diesen Fehler, indem sie die Ausnahme abfangen ( nicht ). Auf diese Weise wird die Ausnahme an ASP.NET weitergeleitet, die eine Webseite mit dem Status "500 Interner Fehler" anzeigt, und alle relevanten Informationen werden protokolliert.
Wenn Ihr Server für die Produktion konfiguriert ist, wird auf der Fehlerseite nur Folgendes angezeigt: "Es ist ein Fehler aufgetreten, Details wurden protokolliert."
Wenn der Server für die Entwicklung konfiguriert ist, erhalten Sie die berühmte gelbe Seite mit dem Ausnahmetyp, der Nachricht und dem Stack-Trace.
Das Ausblenden der Ausnahme und das manuelle Umleiten auf eine Fehlerseite ist eine schlechte Vorgehensweise, da Fehler ausgeblendet werden. Es gibt Werkzeuge, die Ihre Protokolle untersuchen und Ihnen schöne Statistiken geben, zum Beispiel über Prozentsätze erfolgreicher / fehlgeschlagener Anfragen, und diese werden nicht mehr funktionieren.
Also, schlucken Sie nicht die Ausnahme, was Leute tun, und zumindest löst es Ihr Problem.
Nun, ich finde das sehr klobig, weil ich nicht gerne manuell nach den auf der gelben Seite erwähnten Quelldateien suche und manuell zu den erwähnten Zeilennummern gehe. Ich nutze die gelbe Seite praktisch nicht, es könnte genauso gut heißen: "Es ist ein Fehler passiert, weine einen Fluss, nah-nah-nah." Ich lese die gelbe Seite nicht.
Stattdessen logge ich gerne selbst Ausnahmen ein, und ich lasse meinen Logger jede Zeile mit full-path-to-source-filename(line):
beginnen, so dass jede Zeile im Debug-Log in Visual Studio anklickbar ist und automatisch auf eine Zeile geklickt wird die richtige Quelldatei und scrollt zu der exakten Zeile, die die Protokollnachricht ausgegeben hat. Wenn Sie diesen Luxus wollen, dann gehen Sie weiter und fangen Sie die Ausnahme, aber direkt nach der Protokollierung der Ausnahme müssen Sie es erneut, so dass die Dinge ihren normalen Verlauf folgen können.
Änderungsantrag
Hier sind einige Informationen, die in Kommentaren hinzugefügt wurden:
Sie können also Folgendes tun:
%Vor%Oder
%Vor% Führen Sie nicht aus: catch( Exception e ) { log( "information" ); throw e; }
, weil die ursprünglichen Stack-Trace-Informationen von e
verloren gehen.
In Ihrem Code tritt ein Fehler im Abschnitt division (x / = x) auf, so dass keine Umleitungszeile (Indexseite) ausgeführt wird Logger. Sie müssen
Hinweis: Wenn Sie try catch verwenden, tritt kein Blockfehler auf ASP.NET-Ebene auf, was dazu führt, dass die Seite Error.cshtml nicht umgeleitet wird
%Vor%Dies wird Ihre Ausnahmebehandlung rationalisieren und Ihnen erlauben, den Prozess prägnanter zu verwalten. Erstellen Sie ein Attribut wie folgt:
%Vor%Jetzt können Sie es auf einer Controller- oder Methodenebene mit einem Attribut wie diesem verwenden:
%Vor%Oder registrieren Sie es global (global.asax) wie folgt:
%Vor%Tags und Links asp.net-mvc c# error-handling elmah nlog