ExceptionContext.ExceptionHandled ändert sich in true. Wo wird die Ausnahme behandelt?

8

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 .

%Vor%

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 .

%Vor%

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.

    
escist 15.05.2012, 09:06
quelle

1 Antwort

19

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 , aber kurz gesagt:

  1. Führt nur aus, wenn ExceptionHandled falsch ist und benutzerdefinierte Fehler aktiviert sind.
  2. Richtet eine Weiterleitung an die Fehleransicht ein, die standardmäßig Error .
  3. heißt
  4. Legt 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.

    
Richard Fawcett 18.05.2012, 10:21
quelle