2013-05-02 28 views
6

Ho un servizio WCF che ha il seguente codice nel Global.asax:AppDomain.CurrentDomain.UnhandledException non viene chiamato

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); 
} 

L'idea è di almeno registrare tutte le eccezioni che sono unhanded.

Ma non sembra essere mai chiamato. Ho provato a fare Divide by Zero in una delle mie operazioni di servizio e interrompe appena il servizio dopo che ha raggiunto l'eccezione.

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

Il metodo LogUnhandledException non viene mai chiamato.

Ho provato questo in IIS e in esecuzione nel debugger.

Come posso far funzionare questo evento per un servizio WCF?

+0

Mi chiedo se ha qualcosa a che fare con IIS o il modo in cui è ospitato il servizio WCF. Come [qui] (http://mlichtenberg.wordpress.com/2011/09/19/catching-unhandled-exceptions-in-asp-net/), i ragazzi dicono: * In sintesi, eccezioni non gestite in un ASP.NET l'applicazione può essere catturata con un gestore di eventi Application_Error nel global.asax oppure creando un HttpModule per catturare l'evento AppDomain.UnhandledException. * – oleksii

risposta

8

Il unhandled exception filter for an app domain è un ultimo tentativo di consentire all'applicazione di registrare informazioni significative prima che venga interrotta.

Questo evento fornisce la notifica delle eccezioni non rilevate. Consente all'applicazione di registrare le informazioni sull'eccezione prima che il gestore predefinito del sistema segnali l'eccezione all'utente e termina l'applicazione.

Se WCF ha permesso un eccezione generata da un servizio di essere completamente gestita in questo modo vorrebbe dire che quando il servizio è ospitato in IIS l'intero processo di lavoro sarebbe stato risolto in quanto una singola richiesta ha sollevato un'eccezione - non un risultato auspicabile. Di conseguenza, WCF non lascia le eccezioni generate dai servizi non gestiti - questo evento non verrà generato in questo caso.

Se si desidera registrare eccezioni generate dai servizi WCF, controllare invece lo IErrorHandler interface.

0

Hai provato questo?
Da http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

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

Mi chiedo che cosa è la differenza tra la chiamata e questo, con il "+ = new" ... ma ne vale la pena provare.

+2

Nah, è una scorciatoia. Entrambi sono uguali nel codice IL. – oleksii

+0

Non c'è differenza. Uno è solo la notazione C# "vecchia scuola". Si compilano allo stesso modo. – Vaccano

2

Prova anche a prendere una ThreadException, ad es.

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

Ho avuto lo stesso problema nell'app WinForms qualche tempo fa. UnhandledException viene generato per eccezioni veramente non gestite che normalmente interromperanno immediatamente l'intero processo. In genere esiste un gestore globale che non lascia che ciò accada e fornisce un comportamento predefinito. Quindi devi catturare l'eccezione prima che arrivi a quel gestore. Questo può essere fatto tramite una ThreadException.

Problemi correlati