ExceptionContext.ExceptionHandled änderungen zu wahren. Wo ist die Ausnahme behandelt werden?
Ich bin mit einem global-action-filter für die Verarbeitung und protokolliert alle Ausnahmen.
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ElmahHandleErrorAttribute());
filters.Add(new HandleErrorAttribute());
}
Dies ist, wie die " global action filter ElmahHandleErrorAttribute
definiert ist, überschreibt es die OnException
Methode.
public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
//Is the exception handled already? context.ExceptionHandled seems to be true here
if (!context.IsChildAction && (context.HttpContext.IsCustomErrorEnabled))
{
//Do other stuff stuff
//Log to Elmah
}
}
...
}
Ich verstehe nicht, warum der Wert von context.ExceptionHandled
ist true, wenn die OnException
Methode ausführt.
Wie ist diese Ausnahme immer gehandhabt?
-BEARBEITEN-
Ich habe eine customErrors
Abschnitt in der Web.Config
. Ich habe eine ErrorController
Klasse und Aktionen aufgerufen General
und Http404
.
<customErrors mode ="On" defaultRedirect="Error/General">
<error statusCode="404" redirect="Error/Http404"/>
</customErrors>
Was ich nicht verstehe, ist, die controller-action General
wird nicht ausgeführt (breakpoint wird nie erreicht), aber der Wert von ExceptionContext.ExceptionHandled
ist true, wenn der OnException
Methode der ElmahHandleErrorAttribute
beginnt mit der Ausführung.
- Ich kann nicht sehen
context.ExceptionHandled
im code, wo ist es? - Ich entfernte die Kontrollkästchen für Kontext.ExceptionHandled. Es war früher eingeschlossen in der Aussage:
if (!context.IsChildAction && !context.ExceptionHandled && (context.HttpContext.IsCustomErrorEnabled))
- Hast du das überschreiben der
OnException
- Methode der controller? - Nein, ich überschreiben der
OnException
Methode des MVC -HandleErrorAttribute
filter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn eine Ausnahme Auftritt, wird die Reihenfolge der Globale Filter führt in umgekehrter Reihenfolge. Dies bedeutet, dass
HandleErrorAttribute
zuerst ausgeführt wird.Können Sie den code anzeigen von
HandleErrorAttribute
hier, aber kurz gesagt:ExceptionHandled
falsch ist, und benutzerdefinierte Fehlermeldungen sind aktiviert.Error
.ExceptionHandled
zu wahren.Als es ist der erste filter, dann
ExceptionHandled
ist falsch, wenn Sie ausführt, wodurch er die Sicht auf Fehler und EinstellungExceptionHandled
zu wahren. Also, dann, wenn Sie Ihre eigenen filter führt, das ist, warumExceptionHandled
ist bereits auf true gesetzt. Beachten Sie, dass, wenn benutzerdefinierte Fehler deaktiviert wurden, dannExceptionHandled
wäre immer noch falsch, daHandleErrorAttribute
würde nicht getan haben, Ihre Sachen. In diesem Fall, ELMAH, wird sich der Fehler sowieso nicht, wie es unbehandelte (yellow screen of death), so dass der test in der Klasse ist, zu verhindern, dass doppelte Protokollierung der Fehler.Nun zu Ihrer anderen Frage über whey die
General
Aktion nicht ausgeführt wird, diedefaultRedirect
wird nur verwendet, wenn der Filter nicht setzen einige explizite Umleitung selbst, also ist es eigentlich ignoriert, wenn eine Ausnahme Auftritt, die innerhalb einer ActionMethod und Sie haben die Globale filterHandleErrorAttribute
registriert. Es wäre jedoch aufgerufen werden, wenn Sie eine URL eingegeben, die nicht vorhanden sind, d.h. ein Fehler, der nicht auftreten innerhalb einer ActionMethod. Auch, wenn Sie kommentieren Sie die Zeile zu registrierenHandleErrorAttribute
im Globalen.asax.cs, dann erhalten Sie immer dieGeneral
controller-Aktion ausgeführt wird.ElmahHandleErrorAttribute
ist der Umgang mit dem Fehler ersten. Zu Ihrer Frage, Nicht sicher, warum Sie würde wollen, dass die ELMAH zu laufen, wenn erste, denkst du, dass das eine schlechte Idee? Ich Tue dies, weil ich möchte die Anzeige von benutzerdefinierten Fehlerseiten und überprüfen Sie die Art des Fehlers und der Anzeige einer bestimmten Ansicht.HandleErrorAttribute
zu handhaben, die fallback-Fall, wenn es nicht einen Blick, dann ein YSOD tritt auf, und Sie werden möglicherweise am Ende mit ELMAH Protokollierung der Fehler zweimal (einmal in der globalen filter, und einmal, wenn die Ausnahme nicht als markiert behandelt werden). Wenn Sie die Einstellung Ansichten in der ELMAH-filter, dann sollten Sie vielleicht loszuwerden, dieHandleErrorAttribute
insgesamt?HandleErrorAttribute
. Die benutzerdefinierteElmahHandleErrorAttribute
zeigt eine Ansicht. Da habe ich definierten Ereignis Application_Error() inglobal.asax
zu handhaben 404 und andere unbehandelte Ausnahmen, ich glaube nicht, dass ein YSOD angezeigt werden würde.