http://www.cnblogs.com/trying/archive/2012/06/25/2863753.html

今天在CSDN上看到的关于错误返回值的讨论,感觉非常有趣。 从中可以看出被教化的孩子与大神之间的区别...

讨论如下: 先放上提问者的源程序: 这是第一种,做出判断后,如果条件出错,直接return......

 1 int mystrlen(char *str)
2 {
3 int count = 0;
4 if (str == NULL)
5 {
6 return -1;
7 }
8
9 if (*str == 0)
10 {
11 return 0;
12 }
13
14 while(*str != 0 )
15 {
16 count++;
17 str++;
18 }
19 return count;
20 }

这是第二种,先设置一个变量,对变量赋值,只有一个return.....

 1 int mystrlen(char *str)
2 {
3 int ret;
4 if (str == NULL)
5 {
6 ret = -1;
7 }
8 else if (*str == 0)
9 {
10 ret = 0;
11 }
12 else
13 {
14 ret = 0;
15 while(*str != 0 )
16 {
17 ret++;
18 str++;
19 }
20 }
21 return ret;
22 }

这是第三种,使用goto语句:

 1 int mystrlen(char *str)
2 {
3 int ret;
4 if (str == NULL)
5 {
6 ret = -1;
7 goto _RET;
8 }
9
10 if (*str == 0)
11 {
12 ret = 0;
13 goto _RET;
14 }
15
16
17 while(*str !=0 )
18 {
19 ret++;
20 str++;
21 }
22
23 _RET:
24 return ret;
25 }

就这三种返回方式作出了激烈讨论!

从小孩子的观点来看,我们不应该使用GOTO语句,因为它破坏了程序结构,这也是我学编程语言以来老师一直说的。书本上也是如是说...

于是他们开始讨论第1,2种的优劣。 大多数孩子觉得第1种简洁,清晰

。第2种方法使函数只有一个出口。

老鸟们开始发话了: 最好的第3种!对错误处理,统一用goto err 跳转是最方便且效率最高的,从反汇编语句条数可以看出指令用的最少,消耗的寄存器也最少,效率无疑是最高的。并且,使用goto可以使程序变得更加可扩展。当程序需要在错误处理时释放资源时,统一到goto处理最方便。

高手另外提到: 几乎所有的C加密算法库,都会巨量的出现goto来处理错误 这个讨论的确使我受益匪浅!

在以往的程序中,我并没有用过goto语句,因为思想一直被教条化的教育僵硬着,没法往goto那想。 所以在很多返回错误时都是用return err;

另外,看到有些同学对直接返回与最后才返回有意见。认为直接返回的同学觉得这样对代码多的函数直观,并举出万行代码函数的例子。

读到这里我笑了...

我浏览过《重构》,《Clean Code》(代码整洁之道),对其中提出的写出让别人能看懂的代码十分有感觉。

一个上百行的代码已经是丑陋的代码了。 一个函数应该只做一件事,这是Clean Code里面的基本观点。 对有实战经验的程序员与刚出社会血气方刚的同学来说,这个问题真的能分出水平。

另外,看着这些讨论,我觉得自己看了这么多C/C++的经典书籍还是非常有用的,起码我懂得基本的“程序设计”。 适当的场景用goto可以极大的提高程序的可读性,可扩展性...

在后来看到0 bug:C/C++商用工程之道》的时候,更是觉得Goto的用处不少。

用goto做异常处理的更多相关文章

  1. C++中try_catch_throw的做异常处理

    C++中try_catch_throw的做异常处理 选择异常处理的编程方法的具体原因如下: . 把错误处理和真正的工作分开来: . 代码更易组织,更清晰,复杂的工作任务更容易实现: . 毫无疑问,更安 ...

  2. 【异常处理】Java异常如何做异常处理

    类似SpringMVC项目的异常处理可以这样做: 整个项目创建全局的: 1.一个自定义异常如OneException和错误码,统一封装所有异常. 2.一个返回实体类ResponseEntity,包含返 ...

  3. C错误异常处理,异常处理

    预处理器标识#error的目的是什么啊? 指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编 ...

  4. js构建ui的统一异常处理方案(三)

    笔者之前分析了如何实现js的责任链异常处理的方法,通过promise这个异步模型,我们能够对同步方法和异步方法的两种情况,均可以实现责任链模式.有了这些武器,我们就可以开始设计ui的统一异常处理方案了 ...

  5. js构建ui的统一异常处理方案(二)

    上一篇文章,我分析了同步代码做异常处理是基于责任链模式,而通过try.catch等语句可以很容易地实现这种责任链模式.但是如果是异步调用,我们无法直接通过try.catch语句实现责任链模式,并且通过 ...

  6. js构建ui的统一异常处理方案(一)

    从早期从事基于java的服务器端开发,再到之后从事基于web和js的ui开发,总体感觉基于web页面的ui开发远不如服务器端健壮.主要是早期ie浏览器功能太弱小,很多业务被迫放到服务器端去实现,浏览器 ...

  7. java异常处理的设计

    有一句这样话:一个衡量Java设计师水平和开发团队纪律性的好方法就是读读他们应用程序里的异常处理代码. 本文主要讨论开发Java程序时,如何设计异常处理的代码,如何时抛异常,捕获到了怎么处理,而不是讲 ...

  8. C#中一种可调用的异常处理方法

    之前做异常处理时,感觉很麻烦,每个地方都要写try和catch,在博客园上看到一篇文章http://www.cnblogs.com/artech/archive/2012/10/28/automati ...

  9. java异常处理机制

    本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Spring的异常处理框 架,阐述了异常处理的基本原则.并且作者提出了自己处理一个大型应用系统 ...

随机推荐

  1. mysql复习相关

    Mysql相关 mysql增删改查 我们需要修改数据表名或者修改数据表字段时,就需要使用到Mysql Alter命令 删除,添加或修改表字段 alter table student drop regi ...

  2. js正则表达式的一些研究,截取两个字符串中间的字符串

    一个最常用的场景 截取两个字符串中间的字符串 var str = "iid0000ffr";    var substr = str.match(/id(\S*)ff/);    ...

  3. FlumeNG 笔记

    环境:CentOS6.6 64位 + FlumeNG 1.6 请参考推荐文档: Flume-ng的原理和使用 - JunezChen Blog - SegmentFault  https://segm ...

  4. centos 7.0 firewall 防火墙常用命令

    1.查看防火墙是否在运行  firewall-cmd --state [root@localhost ~]# firewall-cmd --staterunning 2.查看都有哪些端口添加到例外 f ...

  5. java中Map,List与Set的区别(转)

    Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类 ...

  6. 用JMeter测试monggodb的请求

    JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接测试MongoDB[即通过MongoDB协议测试],另一种是写Java代码方式测试MongoDB[即通过java请求测试] 注: ...

  7. 纯JS实现俄罗斯方块,打造属于你的游戏帝国

    纯JS俄罗斯方块,打造属于你的游戏帝国. 本文原始作者博客 http://www.cnblogs.com/toutou 俄罗斯方块(Tetris, 俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏 ...

  8. php-fpm启动,重启,终止操作

    最近安装了mysqli扩展,重启了nginx后,phpinfo()没有显示出mysqli,后来搞不出原因,直接使用了pdo连接数据库.直到今天安装redis后phpinfo()没有显示redis,内心 ...

  9. springmvc.xml的基本配置

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  10. $q -- AngularJS中的服务(理解)

      描述 译者注: 看到了一篇非常好的文章,如果你有兴趣,可以查看: Promises与Javascript异步编程 , 里面对Promises规范和使用情景,好处讲的非常好透彻,个人觉得简单易懂. ...