zoukankan      html  css  js  c++  java
  • 用goto做异常处理

    今天在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的用处不少。

  • 相关阅读:
    Java代码输出是“father”还是“child”(二)
    Java代码输出是“father”还是“child”(一)
    “var arr = []; ”和 “var arr = {};” 的区别
    Servlet页面间对象传递的方法
    利用OWI优化SQL
    Oracle 12c 12.1.0.1.0管理控制文件官方文档说明
    计算工资
    检测本地网络连接状态断开以及恢复的方法
    linux 批量创建用户
    比较两表数据
  • 原文地址:https://www.cnblogs.com/trying/p/2863753.html
Copyright © 2011-2022 走看看