2009-11-05 18 views
23

Esiste un modo per gestire globalmente le eccezioni per un servizio Windows? Qualcosa di simile al seguente in applicazioni Windows Forms:Gestore di eccezioni globali per i servizi di Windows?

Application.ThreadException += new ThreadExceptionEventHandler(new ThreadExceptionHandler().ApplicationThreadException); 
+2

La risposta più pertinente per i servizi di Windows è disponibile qui: http://stackoverflow.com/a/5117790/986720 Spiega perché l'eccezione non viene rilevata dal gestore AppDomainUnhandledException –

risposta

20

Ecco un codice piuttosto robusto che consigliamo alle persone di utilizzare quando implementano http://exceptioneer.com nelle loro applicazioni Windows.

namespace YourNamespace 
{ 
    static class Program 
    { 

     [STAThread] 
     static void Main() 
     { 
      AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
      Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
      Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 

     static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
     { 
      HandleException(e.Exception); 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      HandleException((Exception)e.ExceptionObject); 
     } 

     static void HandleException(Exception e) 
     { 
      //Handle your Exception here 
     } 

    } 
} 

Grazie,

Phil.

+0

Dove si trova "Applicazione" in relazione ai Servizi Windows? – ferventcoder

+0

Hai ricevuto risposta per il tuo commento? Dov'è "Applicazione" – HaBo

+3

'Applicazione' (https://msdn.microsoft.com/en-us/library/system.windows.forms.application(v=vs.110).aspx) e gran parte del codice sopra è specifico per WinForms e non rilevante per i servizi di Windows. 'AppDomain.CurrentDomain.UnhandledException' è l'importante per i Servizi. Vedi anche http://stackoverflow.com/questions/2456819/how-can-i-set-up-net-unhandledexception-hand-in-a-windows-service per la discussione sulla gestione delle eccezioni. – Rory

20

Hai provato

AppDomain.CurrentDomain.UnhandledException 

Questo sarà il fuoco per le eccezioni non gestite nel dominio non importa quale filo si verificano su. Se il tuo servizio Windows utilizza più AppDomain, dovrai utilizzare questo valore per ogni dominio, ma la maggior parte no.

+1

Se il servizio viene eseguito utilizzando un 'System.Timers Timer .Timer' e fa un lavoro periodico nell'evento 'Elapsed', quindi le eccezioni non gestite generate in quell'evento non verranno viste dall'evento' AppDomain.CurrentDomain.UnhandledException'. Il timer li inghiotte e non fa nulla con l'eccezione. –

+1

So che questo è un vecchio thread. Lo stesso vale per System.Threading.Timers? –

Problemi correlati