2

In meiner MVC6 Anwendung, ich habe wie unten eine Middleware zu behandeln globale unhandled Ausnahmen mit Invoke Aufgabe erstellt:MVC6 - Ausnahmen Griff unhandled und haben immer noch Fehlerseite Umleitung

try 
{ 
    await _next.Invoke(context); 
} 
catch (System.Exception e) 
{ 
    ... Log the exception here... 
} 

Die Frage, die ich bin vor ist, wenn Ich füge das im configure-Abschnitt hinzu, bevor UseDeveloperExceptionPage/UseExceptionHandle hinzugefügt wird. Dann wird catch block in Middleware nicht getroffen. Wenn ich dies nach UseDeveloperExceptionPage/UseExceptionHandle hinzufüge, werden die Fehlerseite oder das Modul nicht verarbeitet.

Wie kann ich die Fehlerseite/das Modul nicht stören, aber immer noch den Fehler in der Pipeline abfangen und protokollieren?

Vielen Dank im Voraus.

Antwort

1

Dies liegt daran, dass die Seite "Exception" über ein Exception Objekt verfügen muss, um damit zu arbeiten. Ihr Code fängt die Ausnahme ab, die dann unterdrückt wird. Versuchen Sie Erneutes Auslösen der Ausnahme etwa so:

try 
{ 
    await _next.Invoke(context); 
} 
catch (System.Exception e) 
{ 
    //Log the exception here... 
    throw; 
} 
+0

Dank elolos. Ich habe Wurf aus irgendeinem Grund entfernt und habe nicht beobachtet, dass es nicht dort war. Danke für die Antwort. –

1

einfach den Fehler Erneutes Auslösen bewirkt, dass der Stack-Trace den Fehler ihren Ursprung in der Middleware zu zeigen. Sie müssen den Fehler so werfen: ExceptionDispatchInfo.Capture(e).Throw();

+0

'throw e;' wird dazu führen, dass die Stack-Trace verloren geht, aber nicht 'throw;' für sich selbst das gleiche wie 'ExceptionDispatchInfo.Capture (e) .Throw();'? – Ryan

+0

Ja, du solltest nur throw schreiben; in C#. Werfen werfen ex; ist ein gewöhnlicher Java-Programmierfehler beim Schreiben von C#. Also mach sowas wie catch (exception ex) {logger.log (ex); werfen; } – Johan

Verwandte Themen