2009-11-05 14 views
23

Czy istnieje sposób globalnego zarządzania wyjątkami dla usługi systemu Windows? Coś podobnego do następującego w Windows Forms aplikacji:Globalna obsługa wyjątków dla usług Windows?

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

Najbardziej odpowiednia odpowiedź dla usług systemu Windows znajduje się tutaj: http://stackoverflow.com/a/5117790/986720 Wyjaśnia, dlaczego wyjątek nie został przechwycony przez AppDomainUnhandledException handler –

Odpowiedz

20

Oto kilka całkiem niezłych kodów, które radzimy ludziom, gdy implementują http://exceptioneer.com w swoich aplikacjach 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 
     } 

    } 
} 

Dzięki

Phil.

+0

Gdzie jest "Aplikacja" w odniesieniu do Usług Windows? – ferventcoder

+0

Czy otrzymałeś odpowiedź na swój komentarz? Gdzie jest "Aplikacja" – HaBo

+3

'Aplikacja' (https://msdn.microsoft.com/en-us/library/system.windows.forms.application(v=vs.110).aspx) i znaczna część powyższego kodu jest specyficzne dla WinForm i niezwiązane z Usługami Windows. 'AppDomain.CurrentDomain.UnhandledException' jest ważnym dla Usług. Zobacz także http://stackoverflow.com/questions/2456819/how-can-i-set-up-net-unhandledexception-handling-in-a-windows-service dla omówienia obsługi wyjątków. – Rory

20

Czy próbowałeś

AppDomain.CurrentDomain.UnhandledException 

To zadziała na nieobsłużonych wyjątków w danej dziedzinie, bez względu na gwint one wystąpią. Jeśli twoja usługa Windows używa wielu domen aplikacji, musisz użyć tej wartości dla każdej domeny, ale większość nie.

+1

Jeśli twoja usługa działa za pomocą 'System.Timers Timer timera i wykonuje okresową pracę w zdarzeniu "Elapsed", a następnie nieobsłużone wyjątki wywołane w tym wydarzeniu nie zostaną zauważone przez zdarzenie 'AppDomain.CurrentDomain.UnhandledException'. Zegar po prostu je połyka i nie robi nic z wyjątkiem. –

+1

Wiem, że to stary wątek. Czy to samo dotyczy System.Threading.Timers? –