前段時間利用了一點空閑時間優化了項目中的代碼,其中減少Try/Catch是這次優化的重點。
主要是參考了老A的大作:如何編寫沒有Try/Catch的程序,看了一下,老A主要介紹了怎么減少按鈕事件中的Try/Catch,不過我們項目是WCF,基本上就沒有按鈕事件,不過老A也提供了一個很好的思路,那就是利用委托動態的為每個方法加上Try/Catch,有了這個思路之后就很好做了。
核心代碼:
1 private T InvokeHandler<T>(string clientName, string methodName, Delegate delegateWarpper, object[] parameters) 2 { 3 try 4 { 5 //這邊關於第一個參數要注意一下 6 //當委托綁定的方法是靜態的,那么就可以傳“null” 7 //如果綁定的方法不是靜態的,就必須傳當前方法的實例才行,也就是 -- delegateWarpper.Target 8 //如果還不懂,直接MSDN查找,我也是看MSDN的 9 return (T)delegateWarpper.Method.Invoke(delegateWarpper.Target, parameters); 10 } 11 catch (TargetInvocationException exception) 12 { 13 Console.WriteLine(exception.InnerException.Message + Environment.NewLine + exception.InnerException.StackTrace); 14 } 15 return default(T); 16 }
原有的調用方式:
1 public List<string> GetNames(string clientName) 2 { 3 //如果每個方法都這樣寫,那么就要有很多相似的Try/Catch代碼 4 //不僅寫了很多多余的代碼,有使得代碼不夠優美了 5 try 6 { 7 return new List<string>() { "12" }; 8 } 9 catch (Exception exception) 10 { 11 Console.WriteLine(exception.Message + Environment.NewLine + exception.StackTrace); 12 } 13 return null; 14 }
現在的調用方式:
1 public List<string> GetNames(string clientName) 2 { 3 //首先定義委托綁定的方法 4 //可以使用.NET Framework中自帶的Action和Func委托 5 Func<List<string>> func = () => new List<string> { "12" }; 6 //然后調用助手方法就可以了 7 return InvokeHandler<List<string>>(clientName, "GetNames", func, null); 8 }
通過舊的和新的調用方式比較,發現代碼有了很大的縮減,而且從代碼整潔的角度來看新的調用方式更加優美。
這個方法不是萬能的,不過應對80%的情況還是沒有問題滴!
好了,如果園友很有什么好的看法,提出來分享下,Thanks.......
最后祝大家2013春節快樂!
以同步至:個人文章目錄索引