读了一位博友关于使用委托避免重复的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 : "删除成功");
}

拒绝try.catch泛滥,学习委托有感的更多相关文章

  1. 学习nodejs有感

    接触nodejs一段时间了,不断的去接触接触,nodejs是一个能让前端程序员做后台开发的一项技术.  随着学习,让我更好的理解了前后端,以及浏览器是如何运作的

  2. C#高级--通过类来理解学习委托

    namespace classanddelegate { class Program { static void Main(string[] args) { //这是类的实例化 Test test = ...

  3. Android系统移植与驱动开发--第三章 Git使用入门及在学习中有感

    第三章 Git使用入门 使用Git的目的是减少各种版本的Linux的压缩大小,提供源代码在Linux上进行编译. 在这一个章节中,其实就是关键步骤的操作,虽然Git与我们学习的android没有很大的 ...

  4. C#深度学习の委托深度解析

    一.我们在使用C#的过程中,不可避免的用到了委托. 委托的本质是什么呢? 从语法上看,委托是对方法的抽象封装,例如:public void print1(),public void print2(), ...

  5. java try·····catch·····异常处理学习

    异常处理(又称为错误处理)功能 用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件). try....catch....只是异常处理的一种常用方法 try{ //可能导致异常 ...

  6. [C# 学习]委托和线程

    委托有点像C语言的函数指针,简单总结一下如何使用委托. 1. 声明一个委托 public delegate void LabelSetEventHandler(Label la, string str ...

  7. 学习正则有感by魔芋(命名问题)

    魔芋: 事实上,我是反感一些特殊的名词.一些名词看上去就让人感觉到抗拒. 关于一个概念用不同的名词来定义,简直是太糟糕了. 举个例子: 匹配一个后面带有exp2的exp1的正则. 写法: exp1(? ...

  8. 学习Maven有感

    1.maven的由来 maven是一款服务于java平台的自动化构建工具 构建定义:把动态的Web工程经过编译得到的编译结果部署到服务器上的整个过程. 编译:java源文件[.java]->编译 ...

  9. php自定义错误处理和try{}catch(){}学习

    <?php //语法错误 //运行时的错误 //逻辑错误 //php的错误报告级别 // display_errors; // ini_set("display_errors" ...

随机推荐

  1. C# 采用事务批量插入数据

    首先要构建一个实体类,注意实体类的属性和数据的列要一一对应,否则会报错. public class Animal { public string Name { get; set; } public i ...

  2. 犀利点评:csdn某文<第一次创业还是失败了---分享失败的经验>

    今天上午在csdn看了一篇创业文,突然想无节操的做一下点评. 原文详细地址如下:http://blog.csdn.net/android_tutor/article/details/9815801 以 ...

  3. VC++ Post 方法 上传数据到web服务器

    最近在做一个项目,需要与WEB服务器交互一些信息.其中一项就是文件的上传与下载.现来一个上传的代码 #include "stdio.h" #include "WinSoc ...

  4. 关于oracle数据库的导出导出

    Oracle数据导入导出常用两种方式: 1.是通过plsql-->tool-->export/import进行bmp文件的导入与导出: 2.使用命令imp/exp执行oracle数据导入与 ...

  5. C# POST请求

    public string PostWebRequest(string postUrl, string paramData, Encoding dataEncode) { string ret = s ...

  6. Count(*)或者Count(1)或者Count([列]) 区别

    在SQL 中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数.很多人其实对这三者之间是区分不清的.本文会阐述这三者的作用,关系以及背后的原理. 往常我经常会看到一些所 ...

  7. 刚看到的感觉会用的到 收藏一下 常用的iOS第三方资源 (转)

    原文出处:http://blog.csdn.net/ruiwang321/article/details/50591888 一:第三方插件 1:基于响应式编程思想的oc 地址:https://gith ...

  8. 关于兼容性——百分比对于IE浏览器的影响

    之前为了适应页面放大或者缩小,很多宽度都是写的百分比,后来发现有产生换行现象 总结一下: 如果页面是满占位的,我想百分比在谷歌.火狐都应该没什么问题,在IE 就会产生换行  因为IE浏览器存在一个四舍 ...

  9. Number Sequence HDU 1711(KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1711 首次接触KMP,自己都不是特别理解.在网上百度看了好几个帖子之后,对KMP也有了初步的理解. #inclu ...

  10. 【转】oracle 监听静态注册举例解析

    网上有很多关于oracle 监听静态注册的文章,但大多都是简单说说,并没有详细的例子,这里,将结合linux as3 下的oracle 10gR2.0.1 举一个具体的例子 1.在 $ORACLE_H ...