2010-04-04 43 views
5
try 
{ 
    // Code 
} 
catch (Exception ex) 
{ 
    Logger.Log("Message", ex); 
    throw; 
} 

Trong trường hợp thư viện, tôi có nên đăng xuất ngoại lệ không? Tôi có nên ném nó và cho phép ứng dụng đăng nhập không? Mối quan tâm của tôi là nếu tôi đăng nhập ngoại lệ trong thư viện, sẽ có nhiều bản sao (vì lớp thư viện sẽ đăng nhập, lớp ứng dụng sẽ ghi nhật ký và bất kỳ thứ gì ở giữa), nhưng nếu tôi không đăng nhập vào thư viện, sẽ rất khó để theo dõi lỗi. Có cách nào tốt nhất cho việc này không?Khi nào cần đăng nhập ngoại lệ?

Trả lời

3

Tôi sẽ không ghi lại một ngoại lệ mà tôi sẽ không làm bất cứ điều gì với - nghĩa là, nếu nó chỉ đi qua một trình xử lý ngoại lệ như trong ví dụ của bạn. Như bạn đã đề cập, điều này cho biết thêm rất nhiều tiếng ồn không nhất thiết phải hữu ích. Tốt hơn nên ghi lại nó tại điểm mà bạn đang thực sự làm điều gì đó về nó, hoặc, trong trường hợp của một thư viện, tại ranh giới nơi nó chuyển đổi sang mã của người dùng.

Điều đó nói rằng, tôi luôn cố gắng đăng nhập tại điểm mà tôi đang ném ngoại lệ và điều kiện đã kích hoạt ngoại lệ. Điều này hữu ích hơn nhiều để xác định lý do ngoại lệ; cộng với, nếu điều kiện mà bạn gặp phải là đủ xấu để đảm bảo việc ném một ngoại lệ, tôi sẽ nói nó cũng đảm bảo dành thời gian xử lý để đăng xuất 'lý do'.

1

Bạn nên đăng nhập nó cũng như ném nó để ứng dụng có sẵn này cho nó để đăng nhập. Đặc biệt nếu một thư viện của nó, bạn nên đăng nhập nó, như bạn không nên giả định rằng ứng dụng chắc chắn sẽ đăng nhập nó! (Nó có thể hoặc có thể không).

2

Tôi có xu hướng thích đăng nhập lên trình khách cấp cao nhất hoặc cho phép ứng dụng bật/tắt tính năng ghi nhật ký có khả năng bằng cách cung cấp TextWriter vào thư viện mà thư viện ghi nhật ký/lỗi của nó trong trường hợp nó đang chạy trong môi trường không có quyền ghi vào nhật ký thông thường của nó.

Lý do tôi thích đăng nhập ở cấp cao hơn là các cấp cao hơn có nhiều thông tin ngữ cảnh hơn và có thể biết các cách thích hợp hơn để báo cáo/đăng nhập các lỗi này. Kể từ khi ngoại lệ có tất cả các thông tin theo dõi stack trong họ anyway những ngày này, tôi không nghĩ rằng bạn đạt được nhiều bằng cách đăng nhập ngay lập tức khi ngoại lệ xảy ra. Tuy nhiên, bạn phải cẩn thận về các ngoại lệ được chuyển đổi thành các loại ngoại lệ khác, vì vậy hãy liên tục sử dụng InnerException nếu bạn đang chuyển đổi ngoại lệ khi chúng đang được xử lý, để giữ tất cả thông tin về nguồn lỗi.

Chỉnh sửa: Tất nhiên triết lý này chỉ hoạt động trong môi trường mà triết lý khác của tôi được theo sau: không bao giờ bỏ qua ngoại lệ. Nếu khách hàng hoặc một số lớp trung gian ném các ngoại lệ, thì bạn có các vấn đề khác và có thể sẽ cần ít nhất là mặc định bản ghi ngoại lệ của bạn cho một số đầu ra được tạo ngay cả khi khách hàng vô trách nhiệm.

1

Ngoại lệ nhật ký cũng có thể là phương pháp gỡ lỗi ứng dụng.

1

Sử dụng log4net. Nghiêm túc.

Bằng cách sử dụng thư viện chuẩn và phổ biến này, bạn sẽ nhận được hướng dẫn từ những người đã dành nhiều thời gian suy nghĩ về vấn đề này. Giải pháp là hầu hết các thư viện ghi nhật ký đều có một số mức ghi nhật ký.

Trong log4net ví dụ tôi có thể làm

ILog log = LogManager.GetLogger("some logger"); 
log.Debug("some debugging info"); 
log.Info("some message meaningful in the domain"); 
log.Warn("something might be occurring that merits your attention"); 
log.Error("Everything just went to hell") 

Quản trị ứng dụng sau đó có thể thiết lập mức độ khác nhau của việc ghi lại rằng ông quan tâm đến việc nhìn thấy. Có thể thậm chí cho phép anh ta thay đổi cấu hình này khi chạy.Như một vấn đề của thực tế, với một thư viện đăng nhập mạnh mẽ như log4net bạn có thể trực tiếp mức độ đăng nhập khác nhau từ các nguồn khác nhau để appenders khác nhau. Ví dụ: bạn có thể có một tệp tin cuộn với tất cả các thông điệp ghi nhật ký được lưu trữ trên đĩa cứng, tất cả thông tin, cảnh báo và thông báo lỗi không xuất hiện trong lớp truy cập dữ liệu của bạn được đẩy vào cơ sở dữ liệu. cho bạn qua Email.

Tôi nghĩ rằng những gì bạn mô tả rơi khá rõ ràng dưới mức nhật ký "gỡ lỗi".

Tất nhiên, bạn có thể tự mình thực hiện mức đăng nhập nhưng nếu ai sử dụng thư viện của bạn muốn xem tất cả thông tin gỡ lỗi, họ sẽ phải tìm hiểu hệ thống của bạn, ngoài bất kỳ thứ gì họ đang sử dụng. Tốt hơn để chuẩn hóa.

Vì vậy, thực hành tốt nhất:

  1. Sử dụng mức khai thác gỗ khác nhau.
  2. Không cuộn khung đăng nhập của riêng bạn, sử dụng log4net (thực sự là trong ngày và tuổi này khá chuẩn) hoặc ít nhất là entlib logging block của Microsoft.
Các vấn đề liên quan