2012-07-10 9 views
6

Trong WinForms tôi sử dụng:tương đương của System.Windows.Forms.Application.ThreadException cho ứng dụng hoặc cửa sổ dịch vụ điều khiển hoặc bất kỳ quá trình nói chung

  • System.Windows.Forms.Application.ThreadException
  • System. Windows.Application.UnhandledException

Tôi nên sử dụng gì cho ứng dụng đa luồng không phải Winforms?

Hãy xem xét các mã hoàn chỉnh dưới đây trong C# .NET 4.0: tấn

using System; 
using System.Threading.Tasks; 

namespace ExceptionFun 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
      Task.Factory.StartNew(() => 
       { 
        throw new Exception("Oops, someone forgot to add a try/catch block"); 
       }); 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      //never executed 
      Console.WriteLine("Logging fatal error"); 
     } 
    } 
} 

Tôi đã thấy những câu hỏi tương tự như trên stackoverflow, nhưng không ai chứa một câu trả lời thỏa đáng. Hầu hết các câu trả lời đều thuộc loại: "Bạn nên bao gồm xử lý ngoại lệ thích hợp trong mã của bạn" hoặc "Sử dụng AppDomain.CurrentDomain.UnhandledException".

Chỉnh sửa: Có vẻ như câu hỏi của tôi đã bị hiểu lầm, vì vậy tôi đã sửa đổi nó và cung cấp một ví dụ mã nhỏ hơn.

+1

này trông giống như một bản sao của http://stackoverflow.com/questions/3133199/net-global-exception-handler-in-console-application – Jodrell

+1

Nói chung, một trình xử lý ngoại lệ toàn cục nên được sử dụng để đăng nhập. Bạn nên xử lý cục bộ nếu có một điều gì đó hợp lý bạn có thể làm về ngoại lệ. – Jodrell

+0

Điều này sẽ hoạt động tốt. Tất nhiên bạn không muốn sử dụng try/catch, điều đó ngăn cản trình xử lý sự kiện UnhandledException chạy. Bạn không phải tự chăm sóc Die(), nó là tự động. –

Trả lời

0

Bạn không cần bất kỳ sự tương đương nào, sự kiện CurrentDomain.UnhandledException đang hoạt động tốt trong các ứng dụng bảng điều khiển đa luồng. Nhưng nó không phải là bắn trong trường hợp của bạn vì cách bạn bắt đầu chủ đề của bạn. Trình xử lý trong câu hỏi của bạn sẽ không thực thi trong cả ứng dụng Windows và Console. Nhưng nếu bạn bắt đầu chuỗi của mình như thế này (ví dụ):

new Thread(() => { 
    throw new Exception("Oops, someone forgot to add a try/catch block"); 
}).Start(); 

Nó sẽ kích hoạt.

Sự cố Task.Factory.StartNew(...)CurrentDomain.UnhandledException được loại bỏ trong nhiều bài đăng trên SO. Kiểm tra một số gợi ý ở đây:

How to handle all unhandled exceptions when using Task Parallel Library?

What is the best way to catch exception in Task?