2009-11-05 4 views
23

Есть ли способ глобально обрабатывать исключения для службы Windows? Нечто похожее на следующее в Windows Forms приложений:Глобальный обработчик исключений для служб Windows?

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

Наиболее подходящий ответ для служб Windows можно найти здесь: http://stackoverflow.com/a/5117790/986720 Это объясняет, почему исключение не поймано обработчиком AppDomainUnhandledException. –

ответ

20

Вот какой довольно прочный код, который мы советуем людям использовать, когда они реализуют http://exceptioneer.com в своих приложениях для 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 
     } 

    } 
} 

Спасибо,

Фил.

+0

Где «Приложение» применительно к службам Windows? – ferventcoder

+0

Вы получили ответ на свой комментарий? Где «Приложение» – HaBo

+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

20

Вы пробовали

AppDomain.CurrentDomain.UnhandledException 

Это будет срабатывать для необработанных исключений в данной области, независимо от того, какой поток они происходят на. Если ваша служба Windows использует несколько приложений AppDomains, вам нужно будет использовать это значение для каждого домена, но большинство из них этого не делают.

+1

Если ваша служба запускается с использованием 'System.Timers Таймер Таймера и периодическая работа в событии «Elapsed», а необработанные исключения, поднятые в этом событии, не будут видны событием 'AppDomain.CurrentDomain.UnhandledException'. Таймер просто проглатывает их и ничего не делает с исключением. –

+1

Я знаю, что это старая нить. То же самое относится к System.Threading.Timers? –

Смежные вопросы