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

當特定方法發生異常時,應該記錄什麼?發生異常時要記錄什麼?

我在與我一起工作的代碼中看到了很多上述內容。在這些情況下,我總是必須與遇到錯誤的人進行交談,找出他們正在做的事情,逐步瀏覽代碼並嘗試重現錯誤。

是否有任何最佳實踐或方法可以最大限度地減少所有這些額外的工作?我應該像這樣在每種方法中記錄參數嗎?

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

有沒有更好的方式來記錄當前環境?如果我這樣做,我需要爲我的應用程序中的每種方法寫出所有這些東西嗎?有沒有關於這種情況的最佳做法?

回答

5

作爲一般規則,我會努力讓記錄所有必要的信息,以重現導致錯誤的事件過程。請注意,您不一定需要在catch塊中記錄所有內容:您可以在代碼中放置(調試)日誌語句,這些語句位於名爲等的方法中,這些方法使您能夠跟蹤例外之前發生的事情。另外,您應該將信息放入異常本身,以瞭解引起異常的確切症狀。

恕我直言,通過所有的代碼在任何地方添加日誌語句可能是矯枉過正 - 或者至少在實際項目中不符合成本效益。相反,專注於最關鍵的代碼部分以最大限度地從您的努力的回報。這些代碼部分通常是大多數錯誤發生和/或大部分修改(即將完成)的地方。因此,在實踐中,當你需要觸摸一段代碼時,考慮日誌記錄,檢查那裏已經存在的日誌語句(如果有的話),檢查異常處理(如果有的話) - 我經常不僅看到像你的例子那樣的代碼簡單地吞下捕獲到的異常,但是甚至是空的或自動生成的catch塊在我們的遺留代碼中...所有這些都可能使應用程序處於未定義狀態,這是一件糟糕的事情),並考慮一下是否已經足夠了重現失敗並瞭解發生錯誤時發生了什麼。然後儘可能多地改進它,並且可以通過合理的努力。

它還有助於你的隊友討論這個話題,並嘗試制定出如何記錄事件大體的項目約定,如何處理異常等,這可能會爲您節省大量的時間,否則花在追逐的bug和/或改進你的同事所產生的代碼:-(

4

這是非常可怕的代碼,它吃掉了異常,可能使應用程序處於未定義的狀態。一般來說,通過一切手段記錄異常將代碼中的每一位代碼都放在一個try塊中),然後重新拋出。

+2

請注意,重擲應該使用'throw;'和* not *'throw ex;'來完成,以避免擦除調用堆棧。 – 2010-04-04 15:06:24

1

您的日誌記錄框架應該儘可能多地爲您捕獲上下文。至少它可以很容易地捕獲發生錯誤的類。它還應該記錄完整的異常,包括堆棧跟蹤和任何內部異常。

As I answered in your other question您應該使用不同的日誌級別。一旦你這樣做了,如果你正在使用控制容器的反轉,那麼連接攔截所有方法調用的攔截器是非常簡單的任務,並且如果你在調試模式下記錄調用,時間戳和任何參數。

0

這是來自Rico Mariani(CLR perf)的example爲什麼你不應該捕捉所有的例外。診斷真正的問題可能非常困難。

相關問題