用Method來包裝程式中共用的 try catch,簡化程式
之前在處理try ... catch 時,常常會在程式中看到如下的Code,
// Part 1
try
{
string varA = "var A";
int intA = int.Parse(varA);
}
catch (Exception ex)
{
//共用的處理Exception .....
Console.WriteLine(ex.ToString());
}
// Part 2
try
{
string varA = "var A";
int intA = getMyIntvalue(varA);
}
catch (Exception ex)
{
//共用的處理Exception .....
Console.WriteLine(ex.ToString());
}
private int getMyIntvalue(string varA)
{
int intA = int.Parse(varA);
return intA;
}
有時會在底層物件中放那段Code,而將要處理的部份抽出成Method,然後給繼承物件去覆寫。
但是還是會有許多Method需要處理Exception的部份!
如果在某個Layer的Library,Exception需要共同處理時,
可以參考「Building End-to-End Multi-Client Service Oriented Applications」裡的方式。
我們可以用一個 Method 去包裝它,
而將要處理的Code傳進那個 Method 之中,如下,
// 包裝共用的 try catch
//沒有回傳值,用Action
private void ExceptionHandleExecute(Action executeCode)
{
try
{
executeCode.Invoke();
}
catch (Exception ex)
{
//共用的處理Exception .....
Console.WriteLine(ex.ToString());
}
}
//有回傳值,用Func<T>
private T ExceptionHandleExecute<T>(Func<T> executeCode)
{
try
{
return executeCode.Invoke();
}
catch (Exception ex)
{
//共用的處理Exception .....
Console.WriteLine(ex.ToString());
return default(T);
}
}
那Code就會變成如下的寫法,
// Part 1
ExceptionHandleExecute(() =>
{
string varA = "var A";
int intA = int.Parse(varA);
});
// Part 2
int intA1 = ExceptionHandleExecute(() =>
{
string varA = "var A";
return getMyIntvalue(varA);
});
筆者覺得這樣簡潔許多....
另外,如果覺得 ExceptionHandleExecute(Action executeCode) 內容多了 try … catch 的話,也可以改Call ExceptionHandleExecute<T> ,如下,
private void ExceptionHandleExecute(Action executeCode)
{
//改Call ExceptionHandleExecute<T>
ExceptionHandleExecute(() =>
{
executeCode.Invoke();
return true;
});
}
參考資料
Building End-to-End Multi-Client Service Oriented Applications
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^