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の場合、私はあなたの2番目のオプションを好みます。

さらに、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 では、3 番目のオプションを使用します。

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 langage で次のとおりです。

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

したがって、戻り値は 1 つだけで、エラーと成功の両方で実行するアクションがいくつかある場合があります (free... など)。

私の意見は議論できると思います。

于 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 に答える