2017-07-13 15 views
3

我們想在我們的應用程序中刪除多餘的try catch塊。我可以在使用統一IOC時抑制攔截方法中的異常嗎?

顯然,一個統一攔截器可以實現一個通用的處理程序並保存大量重複的代碼。

但我還沒有找到一種方法來抑制攔截方法中的異常。

電流:

void InterceptedMethod 
{ 
    try 
    { 
    } 
    catch() 
    { 
    } 
} 

擬:

void InterceptedMethod 
{ 
    //no try catch blocks 

} 
例如

(使用的StreamReader SR =新的StreamReader(一些無效路徑)) 將所截獲的拋出異常方法,如果我刪除現有的try catch塊,將不會被捕獲。

(result.Exception!= null)之後的代碼正在成功執行。

但它目前只提供「進入前」和「退出後」場景。

我仍然需要刪除攔截方法中的try catch塊。 我知道postsharp或城堡溫莎允許我們設置屬性。

統一IOC的方式是什麼?

回答

0

對於簡單情況,創建一個會吞下異常的IInterceptionBehavior是相對直接的。例如:

public class SuppressExceptionBehavior : IInterceptionBehavior 
{ 
    public IEnumerable<Type> GetRequiredInterfaces() => new Type[0]; 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
    { 
     IMethodReturn result = getNext()(input, getNext); 
     if (result.Exception != null) 
     { 
      result.Exception = null; 
     } 

     return result; 
    } 

    public bool WillExecute => true; 
} 

在上面的例子中,如果方法調用返回一個異常,它將被設置爲null,這將導致異常被吞下。

,容器可能像這樣被配置:

var container = new UnityContainer(); 
container.AddNewExtension<Interception>(); 
container.RegisterType<ITenantStore, TenantStore>(
           new InterceptionBehavior<SuppressExceptionBehavior>(), 
           new Interceptor<InterfaceInterceptor>()); 

這非常適用於簡單的方法,比如你提到的:void InterceptedMethod() { }。但是,對於一般情況,您將不得不分析預期的返回值以確保可以返回正確的類型(否則將引發異常)。

例如,如果該方法有返回值呢?現在,您必須將result.ReturnValue對象設置爲與預期返回類型兼容的值(或使用帶有有效值的input.CreateMethodReturn())。對於引用類型,這可以爲null,所以應該只是在沒有任何變化的情況下工作,但對於值類型(例如int),需要設置特定值。另一個需要處理的例子(避免拋出異常)是爲out參數設置一個默認值。

+0

我遇到的問題是執行getnext行(截取的方法)時發生異常對話框。只有退出對話框後,纔會進入「if(result.Exception!= null)」行。 我希望應用程序的行爲方式與try try時的行爲相同。沒有嘗試catch塊,沒有異常對話框。上面提到的'if'後面的行將像一個公共catch塊一樣用於多個截獲的方法。 – chnstud