5

Tôi mới phát triển phần mềm và cũng mới cho stackoverflow, vì vậy hãy dễ dàng với tôi.Các ngoại lệ chưa được xử lý trong Thư viện lớp C# cho mục đích ghi nhật ký

BỐI CẢNH: Tôi đang phát triển thư viện lớp C# xử lý thư xml được gửi bởi ứng dụng của bên thứ ba trên tcp/ip (sử dụng ổ cắm Async). Tôi đang sử dụng com-interop để đưa thư viện lớp vào một ứng dụng Vb6. Khi thư viện C# xử lý xml nó nhận được qua socket, nó tăng nhiều sự kiện mà ứng dụng vb6 tiêu thụ đăng ký (theo cách này, khi chúng ta viết lại toàn bộ ứng dụng trong .Net, chúng ta sẽ được thực hiện với thành phần này).

CÂU HỎI: Tôi muốn nắm bắt tất cả ngoại lệ chưa được xử lý cho LOGGING PURPOSES ONLY. Trong một ứng dụng winforms, bạn có thể kết nối một sự kiện với AppDomain.CurrentDomain.UnhandledException và tới Application.ThreadException. Không có cách nào để lấy dữ liệu ngoại lệ tương tự để đăng nhập thông tin trong thư viện lớp?

điểm quan trọng:

  • Tôi không cố gắng để phục hồi từ những trường hợp ngoại lệ, nhưng chỉ cần đăng nhập họ và để cho các ngoại lệ tuyên truyền dậy và sụp đổ các ứng dụng nếu cần thiết.

  • Tôi đang cố gắng hết sức để nắm bắt tất cả các ngoại lệ cụ thể tại địa phương bất cứ nơi nào tôi biết rằng chúng có thể xảy ra. Vì vậy, mục đích của tôi là chỉ cần ghi lại các ngoại lệ thật sự không mong muốn.

  • Tôi biết rằng một số người sẽ cho rằng đây sẽ là mẫu thiết kế xấu. Thay vào đó, tôi nên cho phép người gọi đối phó với những ngoại lệ này. Vấn đề là các ứng dụng vb6 không có xử lý lỗi mạnh mẽ tại chỗ như tôi muốn. Chủ yếu, tôi muốn đăng nhập theo dõi ngăn xếp để nếu ứng dụng vb6 bị hỏng do dll của tôi, tôi có thể xem nhật ký để được cảnh báo đến các khu vực tiềm năng của mã C# của tôi có thể cần được thay đổi.

Có ai có thể cung cấp cho tôi một số hướng không? Các tùy chọn tốt nhất mà tôi đã tìm thấy cho đến nay dường như đặt một khối try catch chung trong mọi phương thức công khai, đăng nhập ngoại lệ, và sau đó ném nó. Điều này có vẻ ít hơn lý tưởng:

public void SomeMethod() 
{ 
    try 
    { 
     // try something here... 
    } 
    catch (Exception ex) 
    { 
     Log(ex); 
     throw; 
    } 
} 

Điều này không chỉ có vẻ giống như một thiết kế nghèo, nhưng bổ sung Tôi không biết điều gì sẽ xảy ra nếu một trong những callbacks async gây ra một ngoại lệ trên một sợi khác nhau hơn so với phương pháp này được gọi là trên. Liệu khối try/catch chung này có bắt được ngoại lệ như vậy không?

Cảm ơn bạn đã hỗ trợ.

EDIT: Tôi đã đánh dấu câu trả lời chính xác của @Eric J. nhưng sau khi cố gắng triển khai giải pháp, tôi đã nhận thấy rằng nó sẽ không hoạt động tốt với các cuộc gọi lại không đồng bộ từ lớp ổ cắm mà tôi đang sử dụng . Sau khi một thread threadpool được sử dụng để bắn các cuộc gọi lại async, tôi dường như không thể bắt bất kỳ trường hợp ngoại lệ xảy ra bất kỳ sau này trong ngăn xếp. Tôi có cần phải sử dụng một khuôn khổ AOP, hoặc có cách nào khác để nắm bắt những ngoại lệ này?

+0

Vấn đề thực sự ở đây là tôi không có khối catch ở mức cao nhất trong các chức năng gọi lại không đồng bộ của tôi. Kể từ khi chúng được chạy trên các chủ đề riêng biệt (thread-pool threads), ngoại lệ của chúng không làm 'bong bóng' trở lại bất cứ nơi nào khác. AOP có vẻ như là một giải pháp tốt cho kịch bản này để tránh quá nhiều khối catch cấp cao nhất. Đó là điều tôi dự định đầu tư một chút thời gian trong một chút xa hơn xuống đường. –

Trả lời

2

Nếu bạn có một số điểm nhập giới hạn vào thư viện, hãy xem xét chỉ làm những gì bạn đề xuất - sử dụng lớp trình bao bọc .NET hoặc thư viện trình bao để thực hiện interop thực và bắt/ghi ngoại lệ trong lớp trình bao bọc đó. Trả lại một ngoại lệ hoặc mã lỗi mà thư viện VB6 gọi là biết cách xử lý (cho dù đó là rethrowing ngoại lệ hay không phụ thuộc vào những gì VB6 mã có thể đối phó với).

CrazyDart đề xuất IOC, một giải pháp thay thế thú vị và hợp lệ nhưng cũng bổ sung thêm tính phức tạp và đường cong học tập ban đầu. Chắc chắn có một cái nhìn tại IOC là tốt và concider nó như là một khả năng.

+0

Nó dường như không phải là giải pháp lý tưởng từ một quan điểm mô hình, nhưng một lần nữa, do các ràng buộc thời gian của tôi trông giống như lựa chọn tốt nhất cho dự án hiện tại. Cảm ơn các đầu vào. Chỉ cần làm rõ, bạn có gợi ý thêm một lớp giấy gói hay chỉ là những gì cần thiết để thực hiện tương tác com? –

+0

Không, chỉ một lớp duy nhất thực hiện COM interop và xử lý các ngoại lệ. Nếu bạn có một số lượng lớn các phương thức để bọc, bạn sẽ xem xét viết một trình tạo mã nhỏ, ví dụ: lấy danh sách các phương thức cho mỗi lớp trong COM và xuất ra mã C# thích hợp. Tôi đã làm điều đó trước khi gói một lớp kinh doanh COM rất lớn. Sau đó, một lần nữa nếu nó thực sự lớn, nó có thể là giá trị đầu tư thời gian trong IOC. –

+0

Cảm ơn. Đánh dấu là câu trả lời vì giải pháp này hoạt động tốt nhất cho tôi vào lúc này. –

1

Bạn có thể sử dụng Castle Windsor và một kẻ đánh chặn cho việc này. Một lý do chính đáng để sử dụng IOC cho các dự án.

http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx

Tôi đã sử dụng chúng cho các ngoại lệ khai thác gỗ, cũng giống như bạn nói, và hiệu suất khai thác gỗ ... trong số rất nhiều những thứ khác bạn sử dụng máy bay đánh chặn cho các giao dịch như thế nào.

+0

Tôi đã sử dụng IOC cho các dự án và tự tin rằng nó mang lại nhiều lợi ích nhất cho các dự án lớn với một số nhóm chịu trách nhiệm về các lĩnh vực khác nhau (các mối quan tâm khác nhau). Tôi biết đó là bước vào lãnh thổ chiến tranh thánh, chỉ cần chia sẻ kinh nghiệm cá nhân của tôi. –

+0

Mọi thứ đều có vị trí của nó ... câu hỏi đặt ra là một IMHO chủ đề nâng cao và đòi hỏi một cách tiếp cận khá tiên tiến để giải quyết chính xác. Tôi đồng ý với một số bài viết khác mà AOP (giống như interceptor) là một cách tiếp cận hợp lệ. Về mặt triết học, một số chọn không bao giờ trồng một cây ăn quả. Tôi trồng nhiều lần. Sau đó tôi có thu hoạch lớn. Nhiều người hỏi tôi làm thế nào tôi đến để có rất nhiều cây ăn quả tuyệt vời tìm kiếm và tôi nói với họ tôi trồng thường xuyên. Một số chết, và nhiều người không. Để bỏ bê học tập bởi vì nó là khó khăn là những gì làm cho một người nào đó phù hợp cho công việc dịch vụ và lao động hơn là kỹ thuật. – CrazyDart

+0

Cảm ơn CrazyDart. Tôi đồng ý rằng vấn đề có vẻ khá nâng cao và có thể yêu cầu một cách tiếp cận nâng cao. Thật không may tất cả điều này là mới đối với tôi (Tôi đã phát triển chỉ trong khoảng 6 mos, toàn thời gian chỉ trong 2 tháng qua). Tôi đã đánh dấu cả hai khung AOP và Castle Windsor cho tương lai. Với những hạn chế về thời gian của tôi đối với dự án hiện tại, tôi đang dựa vào hướng tiếp cận của Eric. Nếu bạn có bất kỳ thông tin chi tiết hoặc quan tâm cụ thể nào về điều này trong kịch bản trên, vui lòng tư vấn. Cảm ơn một lần nữa. –

1

Bạn có thể xem xét bằng cách sử dụng khung công tác AOP như Spring.NET hoặc Unity hoặc xem một sản phẩm như PostSharp (mặc dù tôi chưa bao giờ thử PostSharp).

+0

Cảm ơn thông tin. Tôi sẽ đánh dấu các khung này và quay lại với chúng trong tương lai.Hiện tại, tôi sợ đường cong học tập có thể quá lớn để thực hiện các ràng buộc về thời gian của tôi trong dự án. –