zoukankan      html  css  js  c++  java
  • 委托避免重复的try.catch的随笔【转载】

    读了一位博友关于使用委托避免重复的try.catch的随笔(原文地址:http://www.cnblogs.com/foolishfox/archive/2010/07/30/1788416.html),有点感想,写下来与大家分享.

    补充一下原文的例子:

    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 : "删除成功");
    }
  • 相关阅读:
    《一课经济学》八、通货膨胀与尾声
    《一课经济学》七、房租管制和最低工资法
    《一课经济学》六、政府价格管制
    《一课经济学》五、价值体系的运作
    《一课经济学》四、国际贸易
    《一课经济学》三、就业相关
    《一课经济学》二、政府的投资、税收与信贷
    《一课经济学》一、破窗谬误与“战祸之福”
    《人类简史》十五、开启未来(下)——智慧之心
    C++ Template之类模版
  • 原文地址:https://www.cnblogs.com/KruceCoder/p/4081681.html
Copyright © 2011-2022 走看看