2009-11-05 19 views
23

Windowsサービスの例外をグローバルに処理する方法はありますか? Windowsでは次のような何かがフォームアプリケーション:Windowsサービスのグローバル例外ハンドラ?

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

Windowsサービスの最も関連性の高い回答は、http://stackoverflow.com/a/5117790/986720にあります。AppDomainUnhandledExceptionハンドラによって例外がキャッチされない理由を説明します。 –

答えて

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

+0

あなたのコメントに答えを得ましたか? "Application"はどこにありますか? – HaBo

+3

'Application'(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

20

あなたは

AppDomain.CurrentDomain.UnhandledException 

これは関係なく、彼らが起こる何スレッド与えられたドメインに未処理の例外に対して発生しませんを試してみました。 Windowsサービスで複数のAppDomainsが使用されている場合、すべてのドメインでこの値を使用する必要がありますが、ほとんどの場合はそうしないでください。

+1

サービスが 'System.Timers .Timer'タイマーを呼び出し、 'Elapsed'イベントで定期的な作業を行うと、そのイベントで発生した未処理の例外は' AppDomain.CurrentDomain.UnhandledException'イベントでは見られません。タイマーはそれらを呑み込んで例外を除いて何もしません。 –

+1

私はこれが古いスレッドであることを知っています。 System.Threading.Timersにも同じことが当てはまりますか? –

関連する問題