读了一位博友关于使用委托避免重复的try.catch的随笔(原文地址:http://www.cnblogs.com/foolishfox/archive/2010/07/30/1788416.html),有点感想,写下来与大家分享.
补充一下原文的例子:
class="csharp keyword">public
class
CatchExceptions
{
/// <summary>
/// 捕获异常的方法
/// </summary>
/// <param name="func">绑定到委托的方法</param>
/// <returns>异常信息,如果为空则没有产生异常</returns>
public
static
string
TryCatch(Action func)
{
string
runMsg =
string
.Empty;
try
{
func();
}
catch
(Exception ex)
{
runMsg = ex.Message;
}
return
runMsg;
}
/// <summary>
/// 捕获异常的方法
/// </summary>
/// <typeparam name="T">委托的参数类型</typeparam>
/// <param name="func">绑定到委托的方法</param>
/// <param name="param">委托的参数实例</param>
/// <returns>异常信息,如果为空则没有产生异常</returns>
public
static
string
TryCatch<T>(Action<T> func, T param)
{
string
runMsg =
string
.Empty;
try
{
func(param);
}
catch
(Exception ex)
{
runMsg = ex.Message;
}
return
runMsg;
}
/// <summary>
/// 捕获异常的方法
/// </summary>
/// <typeparam name="T1">委托的第一个参数类型</typeparam>
/// <typeparam name="T2">委托的第二个参数类型</typeparam>
/// <param name="func">绑定到委托的方法</param>
/// <param name="param1">委托的第一个参数实例</param>
/// <param name="param2">委托的第二个参数实例</param>
/// <returns></returns>
public
static
string
TryCatch<T1, T2>(Action<T1, T2> func, T1 param1, T2 param2)
{
string
runMsg =
string
.Empty;
try
{
func(param1, param2);
}
catch
(Exception ex)
{
runMsg = ex.Message;
}
return
runMsg;
}
}
原文使用的是Func而此处使用的是Action,到底Func和Action有什么区别呢?
Action委托 表示 封装一个方法,该方法不具有参数并且不返回值
Action<T>委托 是Action的泛型委托 表示封装一个方法,该方法拥有一个参数并且不返回值
Action<T>委托多参数的形式为 Action<T1,T2,T3.....> 且最多只能有16个参数
再来看看Func委托.
Func<TResult>委托 表示 封装一个没有参数但返回TResult类型的值的方法
Func<T,TResult>委托 表示 封装一个有一个参数但返回TResult类型的值的方法
Func<T,TResult>的多参数形式为 Func<T1,T2,T3.....,TResult> 且最多只能有16个参数
所以上述TryCatch方法的参数到底用Action还是Func取决于实际的使用情况,如果需要绑定到委托的方法有返回值,使用Func,如果没有返回值,则使用Action
方法定义好了,如果调用呢?
这里我们定义一个有参数的方法和一个无参的方法
private
void
DeleteObj(
int
objID)
{
//主体省略...
}
private
void
AddObj()
{
//主体省略...
}
分别在添加和删除Button的OnClick()方法中调用
protected
void
btnSave_Click(
object
sender, EventArgs e)
{
string
runMsg = CatchExceptions.TryCatch(AddObj);
Response.Write(runMsg.Length > 0 ?
"添加失败!"
+ runMsg :
"添加成功"
);
}
protected
void
btnDelete_Click(
object
sender, EventArgs e)
{
string
runMsg = CatchExceptions.TryCatch(DeleteObj,objID);
Response.Write(runMsg.Length > 0 ?
"删除失败!"
+ runMsg :
"删除成功"
);
}