2009-11-05 30 views
23

Có cách nào để xử lý ngoại lệ trên toàn cầu cho một Dịch vụ Windows không? Một cái gì đó tương tự như sau trong ứng dụng Windows Forms:Xử lý ngoại lệ toàn cầu cho các dịch vụ windows?

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

Câu trả lời phù hợp nhất cho các Dịch vụ Windows có thể tìm thấy tại đây: http://stackoverflow.com/a/5117790/986720 Nó giải thích lý do ngoại lệ không bị xử lý bởi AppDomainUnhandledException –

Trả lời

20

Dưới đây là một số mã khá mạnh mẽ mà chúng tôi khuyên mọi người nên sử dụng khi họ triển khai http://exceptioneer.com trong Ứng dụng Windows của họ.

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 
     } 

    } 
} 

Cảm ơn,

Phil.

+0

"Ứng dụng" ở đâu liên quan đến Dịch vụ Windows? – ferventcoder

+0

Bạn có nhận được câu trả lời cho nhận xét của mình không? "Ứng dụng" ở đâu là "Ứng dụng" – HaBo

+3

'Ứng dụng' (https://msdn.microsoft.com/en-us/library/system.windows.forms.application(v=vs.110).aspx) và phần lớn mã ở trên là cụ thể cho WinForms và không liên quan đến Windows Services. 'AppDomain.CurrentDomain.UnhandledException' là quan trọng đối với Dịch vụ. Xem thêm http://stackoverflow.com/questions/2456819/how-can-i-set-up-net-unhandledexception-handling-in-a-windows-service để thảo luận xử lý ngoại lệ. – Rory

20

Các bạn đã thử

AppDomain.CurrentDomain.UnhandledException 

này sẽ cháy cho trường hợp ngoại lệ unhandled trong tên miền nhất định không có vấn đề gì chủ đề chúng xảy ra vào. Nếu dịch vụ Windows của bạn sử dụng nhiều AppDomain, bạn sẽ cần phải sử dụng giá trị này cho mỗi miền nhưng hầu hết không.

+1

Nếu dịch vụ của bạn chạy bằng 'System.Timers Bộ đếm thời gian .Timer' và thực hiện công việc định kỳ trong sự kiện 'Elapsed' sau đó các ngoại lệ chưa được nêu trong sự kiện đó sẽ không được nhìn thấy bởi sự kiện' AppDomain.CurrentDomain.UnhandledException'. Bộ hẹn giờ chỉ nuốt chúng và không làm gì với ngoại lệ. –

+1

Tôi biết đây là một chủ đề cũ. Điều tương tự cũng áp dụng cho System.Threading.Timers? –

Các vấn đề liên quan