[.NET]包裝程式中共用的 try...catch

用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:從零開始的軟體開發生活

請大家繼續支持 ^_^