4

在以下代码结构的情况下:

int function_sequence(...)
{
    f1(...);
    f2(...);
    f3(...);
    f4(...);
    f5(...);
    return SUCCESS;
}

哪种错误处理方式更容易接受?

这:

int function_sequence(...)
{
    if(f1(...)){
         // Error handling
         return ERROR;
    }

    if(f2(...)){
         // Error handling
         return ERROR;
    }

    ...

    return SUCCESS;
}

或这个:

int function_sequence(...)
{
    if(f1(...)){
        goto error;
    }

    if(f2(...)){
        goto error;
    }

    ...

    return SUCCESS;

error:
    // Error handling
    return ERROR;
}
4

6 回答 6

3

对于 C,我更喜欢您的第二个选项。

此外,逐步清理(释放分配的内存等)很有用,例如在 Linux 内核中:

int function_sequence(...)
{
    if(f1(...)){
        goto error1;
    }

    if(f2(...)){
        goto error2;
    }

    ...

    return SUCCESS;

error2:
    cleanup2();

error1:
    cleanup1();

    // Error handling
    return ERROR;
}
于 2013-03-06T09:11:24.713 回答
3
int function_sequence(...)
{
    if (f1(...) && f2(...) && f3(...)  && f4(...) && f5(...)) 
        return SUCCESS;
    else
        return ERROR;
}
于 2013-03-06T09:14:53.143 回答
1

在 C 中,我会使用第三个选项:

int function_sequence(...)
{
    bool ok = true;
    if (ok) ok = f1(...);
    if (ok) ok = f2(...);
    if (ok) ok = f3(...);
    if (ok) ok = f4(...);
    if (ok) ok = f5(...);

    if (!ok) error_handling();

    cleanup();  // Your example didn't have this, but it's often here.

    return ok ? SUCCESS : ERROR;
}
于 2013-03-06T09:13:08.167 回答
1

我喜欢做的方式是c语言中的以下内容:

int function_sequence(...)
{
    int res=0;

    if(f1(...)){
        goto ENDF;
    }

    if(f2(...)){
        goto ENDF;
    }

    ...

    res = 1;

ENDF:
   if(res ==0)
   {
      //Error handling
   } 

   //Success and Error stuff to do (like free...).

    return res;
}

所以只有一个返回,有时两者都要做一些动作:错误和成功(例如免费...)。

我想我的观点可以讨论。

于 2013-03-06T09:13:23.933 回答
1

如果是异常情况导致函数无法工作,则抛出异常。

如果您有理由坚持使用返回码,您可以使用

if ( f1() && f2() && .... )
    return SUCCESS;
else
    return ERROR;

false在遇到第一个or之后执行将停止0,因此效果与您的版本几乎相同。

一些库会返回0成功(呵呵,甚至 C++main也会这样做)。所以你可能想要

if ( !f1() &&.... )

或者一个简单的

return f1() && f2() &&.... ;
于 2013-03-06T09:13:50.093 回答
1

这是我通常使用的

int function_sequence(...)
{
    if(f1(...)){
        goto error1;
    }

    if(f2(...)){
        goto error2;
    }

    return SUCCESS;
}

error1:
    // Error 1 handling
    return -eerno1;

error2:
    // Error 2 handling
    return -eerno2;

//end of main
于 2013-03-06T09:14:52.947 回答