2013-02-13 114 views
2

我寫的VS2010自動化(測試項目)的異常。 我已經有相關的信息(字符串)一個Logger類,調試(串)和錯誤(字符串除外)的方法,它實現正確的書寫郵件到文件中。現在自動登錄C#

,我明白我的信息記錄有我的測試的代碼內而編寫的,但反正是有自動寫入錯誤信息的拋出的異常的情況?例外是設計的一部分(我需要拋出它們以確定每個測試的通過/失敗狀態)。

我可以做我的包裹中的try-catch所有代碼的基本實現,在catch寫入塊的Logger.error(),然後再次拋出異常,如:

public class Test 
{ 
    ["TestMethod"] 
    public void RunTest() 
    { 
     try 
     { 
      //run my code here 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("Error message", ex); 
      throw; 
     } 
    } 
} 

但我我不確定使用try-catch來記錄錯誤是一個合適的設計。

我想到兩兩件事:

  1. 創建一個監聽線程,將抓住我的例外,記錄它們 並重新把它們...
  2. 操縱Exception類使用MT Log.Error()(或由它派生 MyException和操縱我的代碼拋出僅 MyException)。
  3. 我已經嘗試安裝企業庫和使用 日誌塊,但我不確定這將適合我的需要(並且我 未能獲得LogWriter的實例或使用無論如何,Logger.Write )。

上午我在正確的道路? 是否有其他方法來實現這種「自動寫入錯誤」?

感謝, 埃拉德

+2

爲什麼要記錄由一個單元測試拋出的異常? – 2013-02-13 13:01:39

+1

我想這只是示例代碼? – JMan 2013-02-13 13:09:49

回答

1

一種可能的方式是包裝你的函數和方法與邏輯來處理記錄/儀器儀表。你可以讓你的測試類都擴展一個自定義的基類,或者只是創建一個實用類並調用wrap功能。看下面的例子。

的實用工具類

class Utility 
{ 
    public static void Wrap(Action method, params object[] parameters) 
    { 
     try 
     { 
      //additional logging/events - see example below 
      Debug.WriteLine("Entering : {0} @ {1}", method.Method.Name, DateTime.Now); 
      foreach (var p in parameters) 
      { 
       Debug.WriteLine("\tParameter : {0}", new object[] { p }); 
      } 


      method(); 
      //additional logging/events - see example below 
      Debug.WriteLine("Exiting : {0} @ {1}", method.Method.Name, DateTime.Now); 
     } 
     catch (Exception ex) 
     { 
      //Log exception 
      throw; 
     } 
    } 


    public static T Wrap<T>(Func<T> method, params object[] parameters) 
    { 
     try 
     { 
      //additional logging/events - see example below 
      Debug.WriteLine("Entering : {0} @ {1}", method.Method.Name, DateTime.Now); 
      foreach (var p in parameters) 
      { 
       Debug.WriteLine("\tParameter : {0}", new object[]{p}); 
      } 

      var retValue = method(); 
      //additional logging/events - see example below 
      Debug.WriteLine("Exiting : {0} @ {1}", method.Method.Name, DateTime.Now); 
      return retValue; 
     } 
     catch (Exception ex) 
     { 
      //Log exception 
      throw; 
     } 

    } 
} 

使用範例

public static void SayHello() 
    { 
     Utility.Wrap(() => 
      { 
       SayHello(" world "); 
      }); 
    } 

    public static void SayHello(string name) 
    { 
     Utility.Wrap(() => 
     { 
      Console.WriteLine("Hello {0}", name); 
     }, name); 
    } 

    public static int GetCount(string s) 
    { 
     return Utility.Wrap(() => 
     { 
      return string.IsNullOrEmpty(s) ? 0 : s.Length; 
     }, s); 
    } 
0

只應落實在應用程序中可能的最高級別的try-catch塊。在那裏你可以處理你的異常並記錄下來。

對於未處理的異常,你可幫了一個事件,例如:AppDomain.CurrentDomain.UnhandledException

在ASP中你可以使用ON_ERROR。這取決於項目的類型。以滿足您的要求