2014-03-13 62 views
7

我有一個類,如:如何捕獲CSharp中的類級別的所有異常?

class SampleRepositoryClass 
{ 
    void MethodA() 
    { 
     try 
     { 
      //do something 
     } 
     catch(Exception ex) 
     { 
      LogError(ex); 
      throw ex; 
     }   
    } 

    void MethodB(int a, int b) 
    { 
     try 
     { 
      //do something 
     } 
     catch(Exception ex) 
     { 
      LogError(ex); 
      throw ex; 
     } 
    } 

    List<int> MethodC(int userId) 
    { 
     try 
     { 
      //do something 
     } 
     catch(Exception ex) 
     { 
      LogError(ex); 
      throw ex; 
     } 
    } 
} 

在上面的例子中,你可以看到,在每一個方法(治法,方法b,MethodC)已經嘗試... catch塊來記錄錯誤,然後扔至更高水平。

想象一下,當我的Repository類可能有超過100個方法時,並且在每種方法中,我都嘗試... catch塊,即使只有一行代碼。

現在,我的意圖是減少這些重複的異常日誌記錄代碼,並在類級而不是方法級別記錄所有異常。

+2

只有[面向方面的編程](http://en.wikipedia.org/wiki/Aspect-oriented_programming)工具/織工[像PostSharp](http://www.postsharp.net/)可以幫助你。順便說一下,在一個類中有超過一百種方法?這只是... *不好*。至少從我的角度來看。而且絕對可怕。 –

+0

這是真的,但我的業務和存儲庫類有許多方法,使這些類太重。實際上,類中方法的數量取決於業務規則的複雜性或您想要執行的操作的數量。 – Haidar

+2

請勿使用「throw ex;」因爲這會破壞你寶貴的調用堆棧。只需寫下「扔」;並且異常中的信息將被保留。有了這個說法,我想指出,除非你知道如何處理它們,否則你不應該發現異常。參考:http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw-and-throw-ex –

回答

1

你太防守了。不要過度使用try..catch只有在你需要需要它。

在這種情況下,考慮捕捉異常情況下與您班級以外的班級進行交互引發的異常。記住例外將被傳播。

1

使用庫,如策略注入應用程序塊,城堡,Spring.NET等。這些庫允許你注入行爲作爲例外捕獲。

+0

請不要使用任何其他庫(策略注入應用程序塊,Castle或Spring.NET)共享一些示例代碼? – Haidar

+0

不幸的是,這些庫實現代理設計模式,並處理了很多反射等。如果我跳過這個管道,我將不得不編碼很多... –

0

Just implement DispatcherUnhandledException in you App.xaml.cs;它會處理你所有的例外;

public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      DispatcherUnhandledException += App_DispatcherUnhandledException; 
     } 
     void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
     { 
      LogError(e); 
// MessageBox.Show(e.Exception.Message); 
      e.Handled = true; 
     } 
+0

對不起,Jannesary,我想在BAL或DAL的類庫中執行它。 – Haidar

5

爲什麼要重新發明輪子,當有這樣的事,作爲免費郵政快遞夏普。 這與將PostSharp.dll作爲參考添加到您的項目一樣簡單。 這樣做之後,你的資料庫看起來像下面這樣:

[Serializable] 
class ExceptionWrapper : OnExceptionAspect 
{ 
    public override void OnException(MethodExecutionArgs args) 
    { 
     LogError(args.Exception); 
     //throw args.Exception; 
    } 
} 

[ExceptionWrapper] 
class SampleRepositoryClass 
{ 
    public void MethodA() 
    { 
     //Do Something 
    } 

    void MethodB(int a, int b) 
    { 
     //Do Something 
    } 

    List<int> MethodC(int userId) 
    { 
     //Do Something 
    } 
} 

添加類上的ExceptionWrapper屬性,確保所有屬性和方法都封裝在try/catch塊中。 catch中的代碼將成爲您在ExceptionWrapper中的overriden函數OnException()中放置的代碼。

你不需要編寫代碼來重新拋出。如果提供了正確的流程行爲,異常也可以自動重新拋出。請檢查文檔。