2010-04-04 42 views
5
public void EatDinner(string appetizer, string mainCourse, string dessert) 
{ 
    try 
    { 
     // Code 
    } 
    catch (Exception ex) 
    { 
     Logger.Log("Error in EatDinner", ex); 
     return; 
    } 
} 

Khi ngoại lệ xảy ra trong một phương pháp cụ thể, tôi nên ghi nhật ký gì?Điều gì cần ghi lại khi ngoại lệ xảy ra?

Tôi thấy rất nhiều điều ở trên trong mã tôi làm việc cùng. Trong những trường hợp này, tôi luôn phải nói chuyện với người đã gặp lỗi để tìm hiểu xem họ đang làm gì, bước qua mã, và cố gắng tạo lại lỗi.

Có phương pháp hay cách hay nhất nào để tôi có thể giảm thiểu tất cả công việc bổ sung này không? Tôi có nên đăng nhập các tham số trong mỗi phương thức như thế này không?

Logger.Log("Params: " + appetizer + "," + mainCourse + "," + dessert, ex); 

Có cách nào tốt hơn để đăng nhập môi trường hiện tại không? Nếu tôi làm theo cách này, tôi có cần phải viết ra tất cả những thứ này cho mỗi phương pháp tôi có trong đơn xin của tôi không? Có bất kỳ thực hành tốt nhất nào liên quan đến các tình huống như thế này không?

Trả lời

5

Theo nguyên tắc chung, tôi có thể cố gắng ghi lại tất cả thông tin cần thiết để tạo lại quá trình sự kiện dẫn đến lỗi. Lưu ý rằng bạn không nhất thiết phải đăng nhập mọi thứ bên trong khối catch: bạn có thể đặt (debug) các câu lệnh đăng nhập xung quanh trong mã của mình, các phương thức bên trong được gọi là v.v. cho phép bạn theo dõi những gì đang diễn ra trực tiếp trước ngoại lệ. Ngoài ra, bạn nên đưa thông tin vào ngoại lệ chính nó về các triệu chứng chính xác những gì gây ra nó.

IMHO thực hiện tất cả mã để thêm các báo cáo đăng nhập ở mọi nơi có thể quá mức - hoặc ít nhất, không hiệu quả về chi phí trong một dự án thực tế. Thay vào đó, tập trung vào các phần mã quan trọng nhất để tối đa hóa lợi nhuận từ những nỗ lực của bạn. Những phần mã này thường là nơi mà hầu hết các lỗi xảy ra và/hoặc sửa đổi nhiều nhất là (sẽ được thực hiện). Vì vậy, trong thực tế bất cứ khi nào bạn cần chạm vào một đoạn mã, hãy nghĩ về việc ghi nhật ký, kiểm tra các câu lệnh đăng nhập đã có (nếu có), kiểm tra xử lý ngoại lệ (nếu có) - tôi thường thấy mã không chỉ như ví dụ của bạn đơn giản là nuốt các ngoại lệ, nhưng thậm chí trống hoặc tự động phát hiện các khối catch trong mã di sản của chúng tôi ... tất cả những điều này có thể khiến ứng dụng ở trạng thái chưa được xác định, đó là BAD THING) và suy nghĩ xem liệu điều gì đã có đủ cho bạn hay không để tái sản xuất thất bại và hiểu những gì đã xảy ra nếu xảy ra lỗi. Sau đó, cải thiện nó nhiều như bạn cần và có thể với một nỗ lực hợp lý.

Nó cũng giúp thảo luận về chủ đề này với các đồng đội của bạn và cố gắng thực hiện một quy ước dự án thô về cách ghi nhật ký sự kiện, cách xử lý ngoại lệ, v.v. Điều này có thể giúp bạn tiết kiệm rất nhiều thời gian và/hoặc cải thiện mã do các đồng nghiệp của bạn tạo ra :-(

4

Đó là mã khá khủng khiếp. Nó ăn ngoại lệ, có lẽ là để lại ứng dụng ở trạng thái chưa được xác định. t quấn từng bit mã trong một khối thử), nhưng sau đó ném lại nó

+2

Lưu ý rằng việc ném lại phải được thực hiện bằng cách sử dụng 'throw; 'và * not *' throw ex; ', để tránh xóa ngăn xếp cuộc gọi. –

1

Khung khai thác gỗ của bạn phải nắm bắt được nhiều bối cảnh nhất có thể. ít nhất nó có thể dễ dàng nắm bắt được lớp mà lỗi xảy ra. Nó cũng nên ghi lại toàn bộ ngoại lệ bao gồm cả stacktrace và bất kỳ ngoại lệ bên trong nào.

As I answered in your other question bạn nên sử dụng các cấp nhật ký khác nhau. Một khi bạn làm điều này, nếu bạn đang sử dụng đảo ngược vùng chứa điều khiển, nó là một nhiệm vụ khá đơn giản để kết nối một máy đánh chặn sẽ chặn tất cả các cuộc gọi phương thức và nếu bạn đang ở chế độ gỡ lỗi, hãy ghi lại cuộc gọi, dấu thời gian và bất kỳ tham số nào.

0

Đây là số example từ Rico Mariani (CLR perf) lý do bạn không nên bắt tất cả ngoại lệ.Nó có thể được thực sự khó khăn để chẩn đoán các vấn đề thực sự.

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