2009-11-03 33 views
16

Chúng tôi có một IPoller giao diện mà chúng tôi có các triển khai khác nhau. Chúng tôi có một quá trình sẽ có một IPoller và bắt đầu nó trong một chủ đề riêng biệt. Tôi đang cố gắng đưa ra một cách chung để cung cấp xử lý ngoại lệ cho bất kỳ IPollers nào không tự thực hiện.Điều gì sẽ xảy ra khi một luồng .NET ném một ngoại lệ?

Suy nghĩ ban đầu của tôi là tạo ra triển khai IPoller chấp nhận IPoller và chỉ cung cấp chức năng ghi nhật ký. Các câu hỏi tôi chạy vào mặc dù là làm thế nào tôi sẽ cung cấp xử lý lỗi này? Nếu tôi có IPoller.Start() mà là mục tiêu cho Thread là nơi mà các ngoại lệ sẽ xảy ra? Hoặc là có một cái gì đó trên các sợi chính nó tôi có thể móc vào?

Trả lời

19

Cái gì như:

Thread thread = new Thread(delegate() { 
    try 
    { 
     MyIPoller.Start(); 
    } 
    catch(ThreadAbortException) 
    { 
    } 
    catch(Exception ex) 
    { 
     //handle 
    } 
    finally 
    { 
    } 
}); 

Điều này sẽ đảm bảo ngoại lệ không biến nó thành đầu chuỗi.

+0

Bạn cũng có thể muốn nắm bắt AppDomainUnloadedException. MSDN: Một AppDomainUnloadedException được ném vào một luồng vì miền ứng dụng mà trong đó luồng đang thực thi đang được dỡ xuống. –

9

Bạn nên bắt ngoại lệ theo phương pháp bạn sử dụng ở đầu chuỗi và thực hiện ghi nhật ký từ đó.

Một ngoại lệ chưa được xử lý (ở đầu chuỗi) sẽ (trong 2.0 trở đi) sẽ hủy quá trình của bạn. Không tốt.

tức là bất kỳ phương pháp nào bạn chuyển đến Thread.Start (v.v) phải có try/catch và làm điều gì đó hữu ích trong catch (ghi nhật ký, có thể tắt máy tiện lợi, v.v.).

Để đạt được điều này, bạn có thể sử dụng:

  • phương pháp tĩnh khai thác gỗ
  • biến bị bắt vào các đại biểu (như là một phương pháp vô danh)
  • phơi bày phương pháp của bạn trên một thể hiện rằng đã biết về logger
3

Hãy xem AppDomain.UnhandledException, nó sẽ giúp bạn ít nhất log những trường hợp ngoại lệ mà bạn không xử lý, và trong một số trường hợp đóng cửa "độc đáo":

Sự kiện này cung cấp thông báo ngoại lệ còn tự do. Nó cho phép ứng dụng ghi lại thông tin về ngoại lệ trước khi hệ thống xử lý mặc định báo cáo ngoại lệ cho người dùng và chấm dứt ứng dụng . Nếu có đủ thông tin về trạng thái của đơn đăng ký là , các hành động khác có thể là được thực hiện - chẳng hạn như lưu chương trình dữ liệu để khôi phục sau này. Lưu ý là được khuyên, bởi vì dữ liệu chương trình có thể bị hỏng khi ngoại lệ là không được xử lý.

0

ngoại lệ Có một cái nhìn tại

Appdomain.FirstChanceException event

Nó nói với bạn bất cứ lúc nào ngoại lệ xảy ra và CLR đang tìm kiếm dấu vết ngăn xếp. Ngoài ra sự kiện args cho biết loại ngoại lệ. Bạn có thể coi đó là nơi trung tâm để đăng nhập.

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