Tôi hiện đang cấu trúc lại một hệ thống con lớn với kiến trúc nhiều lớp và tôi đang vật lộn để thiết kế một chiến lược xử lý lỗi ghi nhật ký \ xử lý lỗi hiệu quả.
Hãy nói rằng kiến trúc của tôi bao gồm ba lớp sau:
- Giao diện công cộng (IE một bộ điều khiển MVC)
- Lớp miền
- Lớp truy cập dữ liệu
Nguồn gây nhầm lẫn của tôi là nơi tôi nên thực hiện ghi nhật ký lỗi \ xử lý:
Giải pháp đơn giản nhất là triển khai ghi nhật ký ở cấp cao nhất (IE Bộ điều khiển giao diện công cộng \ MVC). Tuy nhiên, điều này cảm thấy sai bởi vì nó có nghĩa là tạo ra ngoại lệ thông qua các lớp khác nhau, và sau đó đăng nhập nó; thay vì đăng nhập ngoại lệ tại nguồn của nó.
Ghi nhật ký ngoại lệ tại nguồn của nó rõ ràng là giải pháp tốt nhất vì tôi có nhiều thông tin nhất. Vấn đề của tôi với điều này là tôi không thể bắt được mọi ngoại lệ tại nguồn mà không bắt TẤT CẢ các ngoại lệ và trong lớp giao diện công cộng / miền, điều này sẽ dẫn đến việc bắt các ngoại lệ đã bị bắt, ghi lại và ném lại bởi lớp bên dưới .
Một chiến lược khả thi khác là sự pha trộn giữa # 1 và # 2; nhờ đó tôi bắt được các ngoại lệ cụ thể ở lớp mà chúng có khả năng bị ném nhất (Bắt IE, ghi nhật ký và ném lại
SqlExceptions
trong Lớp truy cập dữ liệu) và sau đó ghi lại bất kỳ ngoại lệ nào chưa được phát hiện ở cấp cao nhất. Tuy nhiên, điều này cũng đòi hỏi tôi phải nắm bắt và loại bỏ mọi ngoại lệ ở cấp cao nhất, bởi vì tôi không thể phân biệt giữa các lỗi đã được ghi lại \ xử lý so với các lỗi không xảy ra.
Bây giờ, rõ ràng đây là một vấn đề trong hầu hết các ứng dụng phần mềm, vì vậy phải có một giải pháp chuẩn cho vấn đề này dẫn đến các ngoại lệ bị bắt tại nguồn và được ghi lại một lần; tuy nhiên tôi không thể thấy cách tự làm việc này.
Lưu ý, tiêu đề của câu hỏi này rất giống với ' Ghi nhật ký ngoại lệ trong ứng dụng nhiều tầng " ', tuy nhiên, câu trả lời trong bài đăng đó thiếu chi tiết và không đủ để trả lời câu hỏi của tôi.
The easiest solution would be to implement the logging at the top level
- làm cái này. Ghi nhật ký ngoại lệ tại nguồn của họ không phải là một ý tưởng hay và mọi ứng dụng tôi gặp phải đều là PITA để gỡ lỗi. Nó phải là trách nhiệm của người gọi để xử lý các trường hợp ngoại lệ.
try{ ... } catch(Exception ex) { Log(ex); }
sẽ dẫn đến cùng một ngoại lệ được ghi lại ở mỗi lớp. (Có vẻ như thực tế khá tệ khi bắt mọi ngoại lệ ở mọi lớp trong cơ sở mã.)