2009-11-05 65 views
23

是否有辦法全局處理Windows服務的異常?類似的事情在Windows下面窗體應用程序:Windows服務的全局異常處理程序?

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

可以在這裏找到Windows服務最相關的答案:http://stackoverflow.com/a/5117790/986720它解釋了爲什麼該異常未被AppDomainUnhandledException處理程序捕獲 – 2016-01-11 19:57:49

回答

20

這裏是我們建議的人,當他們正在實現他們的Windows應用程序http://exceptioneer.com使用一些非常健壯的代碼。

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 
     } 

    } 
} 

感謝,

菲爾。

+0

與Windows服務有關的「應用程序」在哪裏? – ferventcoder 2015-11-16 16:06:01

+0

您的評論有答案嗎? 「應用程序」 – HaBo 2016-05-16 08:02:57

+3

「應用程序」(https://msdn.microsoft.com/en-us/library/system.windows.forms.application(v=vs.110).aspx)和上面的大部分代碼是特定於WinForms並與Windows服務無關。 'AppDomain.CurrentDomain.UnhandledException'是服務的重要一個。另請參閱http://stackoverflow.com/questions/2456819/how-can-i-set-up-net-unhandledexception-handling-in-a-windows-service進行異常處理討論。 – Rory 2016-06-05 14:04:34

20

你試過

AppDomain.CurrentDomain.UnhandledException 

這將觸發對給定域中未處理的異常,不管它們發生了什麼的線程上。如果您的Windows服務使用多個AppDomain,則您需要爲每個域使用此值,但大多數不會。

+1

如果您的服務使用'System.Timers .Timer'定時器,確實在'Elapsed'事件然後在該事件引發未處理的異常將不會被'AppDomain.CurrentDomain.UnhandledException'事件看作週期性的工作。計時器只是吞下它們,並且對例外無所作爲。 – 2017-01-26 00:18:10

+1

我知道這是一個古老的線程。這同樣適用於System.Threading.Timers嗎? – 2017-10-09 20:03:15