2011-05-02 138 views
0

首先處理我會解釋我的項目的結構:異常與企業庫5.0

我有一個WCF服務

public class MyService : IMyService 
{ 
    private QueryHandler _queryHandler; 

    public MyService() 
    { 
     _queryHandler = new QueryHandler(); 
    } 

    public MyObject GetMyObject(string param1, string param2) 
    { 
     return _queryHandler.GetMyObject(param1, param2); 
    } 
} 

的QueryHandler級是在不同的項目,是地方我在哪裏查詢我的數據庫。

我有點困惑哪種方法有關異常處理應用程序塊採取: 不要我把一個try ... catch圍繞在queryhandler每一個數據訪問代碼並執行異常處理,如:

try 
{ 
    //Do something 
} 
catch (Exception ex) 
{ 
    ExceptionManager exManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>(); 
    Exception exceptionToThrow; 
    bool rethrow = exManager.HandleException(ex, "Exceptions Policy", out exceptionToThrow); 

    if (rethrow) 
    { 
     if (exceptionToThrow == null) 
     { 
      throw; 
     } 
     else 
     { 
      throw exceptionToThrow; 
     } 
    } 
    return null; 
} 

還是我把它放在我的web服務類,如:

public MyObject GetMyObject(string param1, string param2) 
    { 
     var exceptionManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>(); 
     return exceptionManager.Process(() => _queryHandler.GetMyObject(param1, param2), "Exceptions Policy"); 
    } 

回答

2

既然你提到WCF,您可以使用內置的[ExceptionShielding]屬性來處理你的服務你的例外。

你最終會像這樣的東西:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    [FaultContract(typeof(FaultContracts.GetMyObjectFault))] 
    MyObject GetMyObject(string param1, string param2); 
} 

[ExceptionShielding("GetMyObjectServicePolicy")] 
public class MyService : IMyService 
{ 
    private QueryHandler _queryHandler; 

    public MyService() 
    { 
     _queryHandler = new QueryHandler(); 
    } 

    public MyObject GetMyObject(string param1, string param2) 
    { 
     return _queryHandler.GetMyObject(param1, param2); 
    } 
} 
+0

這將是我下一步;-)但是,如果我理解正確,使用ExceptionShielding的時候,我不需要使用任何嘗試...再抓?還是我仍然必須把它們放在我的QueryHandler類中? – Koen 2011-05-02 12:59:27

+1

使用該屬性時,您不必擔心代碼中的任何「try {} catch {}」塊,因爲屏蔽策略應爲您處理這些問題。如果你可以從異常中恢復,你可能仍然需要在'QueryHandler'中嘗試{} catch {}'塊,但是如果所有的策略都是'rethrow',我將把處理保留爲屏蔽屬性。 – 2011-05-02 13:17:52

+0

非常感謝。仍然需要做一些關於屏蔽的閱讀,但這是一個很大的幫助。 – Koen 2011-05-02 14:10:42