用goto做异常处理
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做异常处理的更多相关文章
- C++中try_catch_throw的做异常处理
C++中try_catch_throw的做异常处理 选择异常处理的编程方法的具体原因如下: . 把错误处理和真正的工作分开来: . 代码更易组织,更清晰,复杂的工作任务更容易实现: . 毫无疑问,更安 ...
- 【异常处理】Java异常如何做异常处理
类似SpringMVC项目的异常处理可以这样做: 整个项目创建全局的: 1.一个自定义异常如OneException和错误码,统一封装所有异常. 2.一个返回实体类ResponseEntity,包含返 ...
- C错误异常处理,异常处理
预处理器标识#error的目的是什么啊? 指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编 ...
- js构建ui的统一异常处理方案(三)
笔者之前分析了如何实现js的责任链异常处理的方法,通过promise这个异步模型,我们能够对同步方法和异步方法的两种情况,均可以实现责任链模式.有了这些武器,我们就可以开始设计ui的统一异常处理方案了 ...
- js构建ui的统一异常处理方案(二)
上一篇文章,我分析了同步代码做异常处理是基于责任链模式,而通过try.catch等语句可以很容易地实现这种责任链模式.但是如果是异步调用,我们无法直接通过try.catch语句实现责任链模式,并且通过 ...
- js构建ui的统一异常处理方案(一)
从早期从事基于java的服务器端开发,再到之后从事基于web和js的ui开发,总体感觉基于web页面的ui开发远不如服务器端健壮.主要是早期ie浏览器功能太弱小,很多业务被迫放到服务器端去实现,浏览器 ...
- java异常处理的设计
有一句这样话:一个衡量Java设计师水平和开发团队纪律性的好方法就是读读他们应用程序里的异常处理代码. 本文主要讨论开发Java程序时,如何设计异常处理的代码,如何时抛异常,捕获到了怎么处理,而不是讲 ...
- C#中一种可调用的异常处理方法
之前做异常处理时,感觉很麻烦,每个地方都要写try和catch,在博客园上看到一篇文章http://www.cnblogs.com/artech/archive/2012/10/28/automati ...
- java异常处理机制
本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Spring的异常处理框 架,阐述了异常处理的基本原则.并且作者提出了自己处理一个大型应用系统 ...
随机推荐
- C#客户端的异步操作
上篇博客[用Asp.net写自己的服务框架] 我讲述了如何实现自己的服务框架,但我想很多人应该用过WebService这类服务框架,相比起来,似乎还缺少什么东西, 是的,我也感觉到了.比如:我可以很容 ...
- Oracle以15分钟为界,统计一天内各时间段的数据笔数
db.table替换为自己的表名,StartTime为date字段 select count(*), (case floor((to_char(StartTime,'mi'))/15) when 0 ...
- MyBatis源码分析(5)——内置DataSource实现
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...
- Salesforce ADM201备考心得
Salesforce拥有很多针对不同角色的认证考试.ADM201是面对初级管理员的认证. 考试形式是单选题和多选题(如果是多选题,题干上会提示你要多选),两个小时时间,60道题目.内容涉及管理Sale ...
- free-简单明了解释清楚怎么看内存使用
free命令可以用来查看系统内存使用情况.我一般习惯-m参数以MB的方式查看 [root@localhost ~]# free -m total used free shared buffers ca ...
- POI对Excel自定义日期格式的读取
用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel private List<String[]> rosolveFile(InputStream is, String ...
- juery学习总结(一)——juery选择器
juery在工作中经常使用,遇到不会的问题往往百度一下,事后就忘.使用到现在也感觉不到有什么提高,为了每天进步一点点,从今天起抽时间记录下对juery的学习. 学习之前,首先要了解什么是网页元素,网页 ...
- shell 计算2
转载 http://www.th7.cn/system/lin/201309/44683.shtml expr bc 在Linux下做算术运算时你是如何进行的呢?是不是还在用expr呢?你会说我还会b ...
- Apache Curator: Zookeeper客户端
Apache Curator Framework url: http://curator.apache.org/curator-framework/ The Curator Framework is ...
- R语言画云字图
install.packages('wordcloud') library(wordcloud) colors=c('red','blue','green','yellow','purple') da ...