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

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

下面是三种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 ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (8 人打了分,平均分: 3.13 )
Loading...

C语言下的错误处理的问题》的相关评论

  1. 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 */
    }

  2. 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的使用.:-)

  3. 我喜欢的方式:

    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 );
    }

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

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

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

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

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

    return do_the_thing( bar );
    }

    return 0;

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

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注