Ich verwende einen globalen Aktionsfilter, um alle Ausnahmen zu behandeln und zu protokollieren.
%Vor% So ist der globale Aktionsfilter ElmahHandleErrorAttribute
definiert - er überschreibt die Methode OnException
.
Ich verstehe nicht, warum der Wert von context.ExceptionHandled
wahr ist, wenn die Methode OnException
ausgeführt wird.
Wie wird mit dieser Ausnahme umgegangen?
-EDIT -
Ich habe einen customErrors
Abschnitt in Web.Config
. Ich habe eine Klasse ErrorController
und Aktionen namens General
und Http404
.
Was ich nicht verstehe, ist, dass die Controller-Aktion General
nicht ausgeführt wird (Haltepunkt wird nie getroffen), aber der Wert von ExceptionContext.ExceptionHandled
wird auf wahr gesetzt, wenn die OnException
-Methode von ElmahHandleErrorAttribute
beginnt mit der Ausführung.
Wenn eine Ausnahme auftritt, wird die Reihenfolge der globalen Filter ausgeführt in umgekehrter Reihenfolge . Dies bedeutet, dass HandleErrorAttribute
zuerst ausgeführt wird.
Sie können den Code von HandleErrorAttribute
hier
ExceptionHandled
falsch ist und benutzerdefinierte Fehler aktiviert sind. Error
. ExceptionHandled
auf true fest. Da es der erste Filter ist, ist ExceptionHandled
bei der Ausführung false, was dazu führt, dass die Ansicht auf Fehler gesetzt und ExceptionHandled
auf true gesetzt wird. Wenn also ein eigener Filter ausgeführt wird, ist ExceptionHandled
bereits auf "true" gesetzt. Beachten Sie, dass ExceptionHandled
immer noch falsch ist, wenn benutzerdefinierte Fehler deaktiviert wurden, da HandleErrorAttribute
seine Daten nicht ausgeführt hätte. In diesem Fall wird ELMAH den Fehler trotzdem protokollieren, da er nicht behandelt wird (gelber Bildschirm des Todes), sodass der Test in Ihrer Klasse eine doppelte Protokollierung des Fehlers verhindern soll.
Nun zu Ihrer anderen Frage zu Whey, die Aktion General
wird nicht ausgeführt, die defaultRedirect
wird nur verwendet, wenn die Filter selbst keine explizite Umleitung festlegen. Daher wird sie ignoriert, wenn eine Ausnahme auftritt eine ActionMethode und Sie haben den globalen Filter HandleErrorAttribute
registriert. Es würde jedoch aufgerufen werden, wenn Sie eine URL eingeben, die nicht existiert, d. H. Einen Fehler, der nicht innerhalb einer ActionMethod auftritt. Wenn Sie die Zeile zur Registrierung von HandleErrorAttribute
in Global.asax.cs auskommentieren, erhalten Sie immer die Aktion General
controller ausführen.
Tags und Links asp.net-mvc asp.net-mvc-3 exception-handling custom-error-pages