2012-05-04 21 views
0

エラーが発生した場合は1を返す関数がいくつかあります。各関数は、下位関数が1を返すように、下位関数を呼び出します。元の関数も同様に1を返します。したがって、エラーはこのようにチェーンに渡されます。エラー処理文はどのようにフォーマットされますか?

if (low_level_function()) { 
    [do stuff] 
    return 1; 
} 
[do other stuff] 
return 0; 

は、私が代わりに、エラー変数を宣言することにlow_level_function()の結果を代入して、もし(でエラー変数を使用する必要があります。

はここで、これらの機能のうちの一つの非常に簡略版です)声明?言い換えれば、

int error = low_level_function(); 
if (error) { 
    [do stuff] 
    return 1; 
} 
[do other stuff] 
return 0; 

これを行うにはさらに別の方法がありますか?私は前にエラーを説明するようにコーディングしたことがないので、ここでの私の経験はかなり限られています。

編集:コードの性質をよりよく伝えるために関数を再フォーマットしました。

+1

方法について'return low_level_function();'?間に物事が必要な場合は、 'int error = low_level_function(); ...;エラーを返す; '。多くの人が 'return condition;'が 'return(condition?true:false);より良いということに同意します。 – chris

+3

例外を見ましたか? – 111111

+0

@ 111111:OPはおそらくそれをC++にタグ付けすることを意味しなかったでしょう(通常のC++とCの組み合わせタグで判断して)。 – user7116

答えて

1

上記の2つの方法の違いはわかりません。

私はexceptionを使用しています。はるかにクリーンなアプローチです。なぜ再発明車?標準例外を使用することもできるし、カストム例外を実装することもできますlike

+0

エラー処理の階層が非常に迅速に成長したため、例外を使用して終了しました。 – SharpHawk

1

あなたはlow_level_function()リターンがエラーの場合はゼロ以外、成功にゼロ

return low_level_function(); 

場合、また、これを使用することができます。または

return low_level_function()>0? 1 : 0; 
+1

技術的には、2番目の例は 'return !! low_level_function();'と書くことができます。それはもっと個人的な好みです。 – chris

+0

@chris wow!これはWOWのようなものです:D – Dewsworld

2

2番目の形式を好む理由の1つは、エラーの場合に何もしないで、ネストされたif文の階段状の効果を避けたい場合です。

return low_level_function() || second_function() || third_function(); 
+0

あなたの最初/上の提案は、私自身の答えに対する私のお気に入りの選択肢です...しかし、私はそれがエラーフラグに関する多くのテストの場合には効率が悪いと主張しています。私のソロションから逃げることは、コンパイラがもっとよく理解できるように助けてくれるでしょう。;-) – alk

0

それはそれのS側のコメントは - 私、私はを好む最初stateingことが:あなたは本当に||の短絡プロパティを使用して簡素化することができ、その具体例についてもちろん

int error_flag = low_level_function(); 
if (!error_flag) 
    error_flag = second_function(); 
if (!error_flag) 
    error_flag = third_function(); 
return error_flag; 

任意の方法でを終了します。

1つの場所でエラー・ロギング・ステートメントを必要とする可能性があります。

また、デバッグ用のトレースログを追加するのも非常に簡単です。

だから、このアイデアは、私は上記のスキームで次のバリエーションが役立つかもしれない「悪」であることgotoを主張するものについては、以下の

#define OK (0) 

int mid_level_func(....) 
{ 
    log_entry(...); 

    int rc = OK 

    { 
    ... 

    if ((rc = low_level_func1(...))) 
     goto lblExit; 

    ... 

    if ((rc = low_level_func2(...))) 
     goto lblExit; 

    ... 

    lblExit: 
    ; 
    } 

    if (OK != rc) 
    log_error(rc, ...); 

    log_exit(...); 

    return rc; 
} 

を提案したい次

#define OK (0) 

int mid_level_func(....) 
{ 
    log_entry(...); 

    int rc = OK 

    do 
    { 
    ... 

    if ((rc = low_level_func1(...))) 
     break; 

    ... 

    if ((rc = low_level_func2(...))) 
     break; 

    ... 

    } while (0); 

    if (OK != rc) 
    log_error(rc, ...); 

    log_exit(...); 

    return rc; 
} 
+0

ダウンボッターは説明したいかもしれません。 – alk

関連する問題