2013-05-02 16 views
6

ich einen WCF-Dienst, die den folgenden Code in Global.asax hat:AppDomain.CurrentDomain.UnhandledException wird nicht genannt

protected void Application_Start(object sender, EventArgs e) 
{ 
    // Make sure that any exceptions that we don't handle at least get logged. 
    AppDomain.CurrentDomain.UnhandledException += LogUnhandledException; 
} 

private void LogUnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Log.Error.LogException("UnhandledException", e.ExceptionObject as Exception); 
} 

Die Idee ist, zumindest auf alle Ausnahmen protokollieren, die unhanded werden.

Aber es scheint nie zu heißen. Ich habe versucht, eine Divide by Zero in einem meiner Service-Operationen zu machen, und es stoppt nur den Service, nachdem es die Ausnahme erreicht hat.

int zero = 0; 
int result = 100/zero; 

Die LogUnhandledException-Methode wird nie aufgerufen.

Ich habe dies sowohl in IIS versucht und im Debugger ausgeführt.

Wie kann ich dieses Ereignis für einen WCF-Dienst verwenden?

+0

Ich frage mich, ob es etwas mit IIS zu tun hat oder wie der WCF-Dienst gehostet wird. Wie [hier] (http://mlichtenberg.wordpress.com/2011/09/19/catching-unhandled-exceptions-in-asp-net/), sagt die Jungs: * Zusammenfassend, nicht behandelte Ausnahmen in einem ASP.NET Anwendung kann mit einem Ereignishandler Application_Error in der Datei global.asax abgefangen werden, oder indem ein HttpModule erstellt wird, um das Ereignis AppDomain.UnhandledException abzufangen. * – oleksii

Antwort

8

Der unhandled exception filter for an app domain ist ein letzter Versuch, der Anwendung zu ermöglichen, wichtige Informationen vor dem Beenden zu protokollieren.

Dieses Ereignis enthält Benachrichtigungen über nicht abgefangene Ausnahmen. Es ermöglicht der Anwendung, Informationen über die Ausnahme zu protokollieren, bevor der Systemstandardhandler die Ausnahme an den Benutzer meldet und die Anwendung beendet.

Wenn WCF erlaubte eine von einem Dienst geworfen Ausnahme vollständig auf diese Weise nicht behandelte sein würde es bedeuten, dass, wenn der Dienst in IIS-Prozess, da eine einzelne Anforderung eine Ausnahme ausgelöst beendet würde der gesamte Arbeiter gehostet wird - keine wünschenswertes Ergebnis. Daher hinterlässt WCF keine Ausnahmen, die von nicht behandelten Diensten ausgelöst werden. Dieses Ereignis wird in diesem Fall nicht ausgelöst..

Wenn Sie Ausnahmen, die von WCF-Diensten ausgelöst werden, protokollieren möchten, sehen Sie sich stattdessen die IErrorHandler interface an.

0

Haben Sie das versucht?
Von http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(LogUnhandledException); 

frage ich mich, was für einen Unterschied zwischen Ihrem Anruf ist und diese, mit dem „+ = new“ ... aber es ist den Versuch wert.

+2

Nein, es ist eine Verknüpfung. Beide sind im IL-Code identisch. – oleksii

+0

Es gibt keinen Unterschied. Man ist nur "alte Schule" C# -Notation. Sie kompilieren das gleiche. – Vaccano

2

Versuchen Sie auch, eine ThreadException, z.

 Application.ThreadException += Application_ThreadException; 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

Ich hatte das gleiche Problem in der WinForms App vor einer Weile. UnhandledException wird für wirklich nicht behandelte Ausnahmen ausgelöst, die normalerweise Ihren gesamten Prozess sofort beenden würden. In der Regel gibt es einen globalen Handler, der das nicht zulässt und ein Standardverhalten bietet. Sie müssen also die Ausnahme abfangen, bevor sie an diesen Handler übergeben wird. Dies kann über eine ThreadException erfolgen.

Verwandte Themen