0

エラーが発生した場合に 1 を返す関数がいくつかあります。各関数は下位レベルの関数を呼び出します。下位レベルの関数が 1 を返す場合、元の関数も 1 を返します。したがって、エラーはこのようにチェーンを通過します。

以下は、これらの関数の 1 つの高度に簡略化されたバージョンです。

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

代わりにエラー変数を宣言し、それに low_level_function() の結果を割り当ててから、if() ステートメントでエラー変数を使用する必要がありますか? 言い換えると:

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

または、これを行う別のより良い方法はありますか?これまでエラーを考慮してコーディングしたことがないため、ここでの経験はかなり限られています。

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

4

4 に答える 4

2

2 番目の形式を好む理由の 1 つは、エラーの場合に何もする必要がなく、ネストされた if ステートメントの階段状の影響を避けたい場合です。

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

もちろん、その特定の例では、の短絡プロパティを使用して本当に単純化できます||

return low_level_function() || second_function() || third_function();
于 2012-05-04T17:18:42.493 に答える
1

これも使えますが、

return low_level_function();

low_level_function()がエラーで非ゼロを返し、成功でゼロを返す場合。または

return low_level_function()>0? 1 : 0;
于 2012-05-04T15:50:08.207 に答える
1

上記の2つのアプローチの違いはわかりません。

exceptionを使用することをお勧めします。よりクリーンなアプローチです。なぜ車輪を再発明するのですか?標準例外を使用するか、次のようなカスタム例外を実装できます

于 2012-05-04T15:52:07.423 に答える
0

サイドコメントですが、最初に、どのメソッドでも1つの出口を使用することをお勧めします。

彼の構造の主要な利点の1つは、1か所でエラーログステートメントのみが必要になる可能性があることです。

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

したがって、このアイデアに従って、私は次のことを提案します

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

「悪」であることを主張するものについては、goto上記のスキームの次のバリエーションが役立つかもしれません:

#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;
}
于 2012-05-04T18:43:02.157 に答える