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

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

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

下面是三种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;
}




好烂啊有点差凑合看看还不错很精彩 (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的异常处理函数不就解决了。

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

无觅相关文章插件,快速提升流量