2009-11-05 5 views
23

Existe-t-il un moyen de gérer globalement les exceptions pour un service Windows? Quelque chose de semblable à ce qui suit dans les applications Windows Forms:Gestionnaire d'exception global pour les services Windows?

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

La réponse la plus pertinente pour Windows Services peut être trouvée ici: http://stackoverflow.com/a/5117790/986720 Il explique pourquoi l'exception n'est pas interceptée par AppDomainUnhandledException handler –

Répondre

20

Voici un code assez robuste que nous conseillons aux utilisateurs d'utiliser lors de l'implémentation de http://exceptioneer.com dans leurs applications 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 
     } 

    } 
} 

Merci,

Phil.

+0

Où est "Application" par rapport aux services Windows? – ferventcoder

+0

Avez-vous reçu une réponse à votre question? Où est "Application" – HaBo

+3

'Application' (https://msdn.microsoft.com/en-us/library/system.windows.forms.application(v=vs.110).aspx) et une grande partie du code ci-dessus est spécifique à WinForms et non pertinent pour les services Windows. 'AppDomain.CurrentDomain.UnhandledException' est l'élément important pour les services. Voir aussi http://stackoverflow.com/questions/2456819/how-can-i-set-up-net-unhandledexception-handling-in-a-windows-service pour la discussion sur la gestion des exceptions. – Rory

20

Avez-vous essayé

AppDomain.CurrentDomain.UnhandledException 

Cela ouvrira des exceptions non gérées dans le domaine donné, peu importe quel fil ils se produisent sur. Si votre service Windows utilise plusieurs AppDomains, vous devez utiliser cette valeur pour chaque domaine, mais la plupart ne le font pas.

+1

Si votre service s'exécute avec un System.Timers .Timer' timer et effectue un travail périodique dans l'événement 'Elapsed', les exceptions non gérées générées dans cet événement ne seront pas vues par l'événement' AppDomain.CurrentDomain.UnhandledException'. La minuterie les avale et ne fait rien à l'exception. –

+1

Je sais que c'est un vieux fil. La même chose s'applique-t-elle à System.Threading.Timers? –

Questions connexes