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?
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. –