首页 > C/C++语言, 程序设计, 编程语言 > C语言下的错误处理的问题

C语言下的错误处理的问题

2009年4月17日 发表评论 阅读评论 4,012 人阅读    

下面是三种C语言的错误处理,你喜欢哪一种?还是都不喜欢?

/* 问题: 不充分,而且很容易出错,前面成功分配的资源,后面出错需要帮助释放 */
int foo(int bar)
{
        int return_value = 0;
        int doing_okay = 1;
        doing_okay = do_something( bar );
        if (doing_okay)
        {
                doing_okay = init_stuff();
        }
        if (doing_okay)
        {
                doing_okay = prepare_stuff();
        }
        if (doing_okay)
        {
                return_value = do_the_thing( bar );
        }
        return return_value;
}

/* 问题: 使用goto语句是很不好的 */
int foo(int bar)
{
        if (!do_something( bar )) {
                goto error;
        }
        if (!init_stuff( bar )) {
                goto error;
        }
        if (!prepare_stuff( bar )) {
                goto error;
        }
        return do_the_thing( bar );
error:
        return 0;
}
 
/* 问题:太多的if嵌套了,无法阅读 */
int foo(int bar)
{
        int return_value = 0;
        if (do_something( bar )) {
                if (init_stuff( bar )) {
                        if (prepare_stuff( bar )) {
                                return_value = do_the_thing( bar );
                         }
                }
        }
        return return_value;
}

(转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——
好烂啊有点差凑合看看还不错很精彩 (3 人打了分,平均分: 4.33 )
Loading ... Loading ...
  1. 2009年4月17日14:33 | #1

    用switch怎么样?

  2. oldbee
    2009年4月19日20:34 | #2

    Claymore :
    用switch怎么样?

    程序的逻辑是要顺序执行吧(如果都成功的话)。

    我一般会选择第二种^_^
    不过,如果每一步都比较简单的话,或者错误处理都相同,我会选择
    if ( do_something() &&
    init_stuff() &&
    prepare_stuff() )
    {
    return do_the_ting();
    }
    else
    {
    return 0; /* return error. make sure you have cleaned up the enviroment e.g. free the memory you have allocated */
    }

  3. khb_gl
    2009年6月5日15:51 | #3

    int foo(int bar)
    {
    do{
    if (!do_something( bar )) {
    break;
    }
    if (!init_stuff( bar )) {
    break;
    }
    if (!prepare_stuff( bar )) {
    break;
    }
    return do_the_thing( bar );
    }while(0);
    return 0;
    }
    这个方式怎么样呢?避免了goto的使用.:-)

  4. 2010年2月27日13:09 | #4

    @khb_gl
    没必要弄得这么麻烦只为了避开 goto 吧。这里有一个关于 goto 的讨论: http://www.cplusplus.com/forum/beginner/16743/

  5. 局部变量
    2011年2月9日15:55 | #5

    我喜欢的方式:

    int foo(int bar)
    {
    if (!do_something( bar ))
    return 0;
    if (!init_stuff( bar ))
    return 0;
    if (!prepare_stuff( bar ))
    return 0;
    return do_the_thing( bar );
    }

  6. liyangdal
    2011年2月10日09:45 | #6

    我日,要这么复杂么,用setjmp longjmp这两个C的异常处理函数不就解决了。

  7. kane
    2012年4月24日20:16 | #7

    上HN了:http://news.ycombinator.com/item?id=3883310

  8. 年轻的革命者
    2013年3月24日21:36 | #8

    个人感觉C语言中处理异常的三种方法应该是如下三种:
    1. 检查函数的返回值来发现异常错误,并通过调用perror()函数将错误原因进行打印。
    2. 使用signal()和raise()函数
    使用signal()设置信号,调用raise引发信号,并进入相应的异常处理过程。
    3. 使用非局部跳转函数
    可以调用C标准库中的非局部跳转函数setjmp()和longjmp()来进行异常处理。

    不知道是否还有更好的方法,望大虾们给出指点

  9. KISSMonX
    2013年7月9日10:06 | #9

    果断 goto ! 用在这里最好了.

  10. fire
    2013年10月21日18:23 | #10

    第二个完全可以用 || 啊,前面条件不满足后续也不会求值。

    if (!do_something( bar )||(!init_stuff( bar )|| (!prepare_stuff( bar ))||do_the_thing( bar ) {

    return do_the_thing( bar );
    }

    return 0;

  11. fire
    2013年10月21日18:24 | #11

    @fire
    错了是&&。。。一直分不清

  12. 2014年4月2日20:11 | #12

    int foo(int bar) {
    if (do_something(bar) && init_stuff() && prepare_stuff())
    return do_the_thing(bar);

    真意外没人提到这解法,《C陷阱与缺陷》有提到:在 if 的判断条件句里,若其中一个子表达式为 false, 后面就不会执行了。

  1. 2011年2月9日08:46 | #1
  2. 2011年2月9日16:41 | #2