0

C++ コードを例外セーフにしようとしていますが、友人に尋ねたり Web を検索したりしても解決しないという問題が発生しました。

私の理解では、コンストラクターでオブジェクトを作成すると例外がスローされる可能性があるため、作成するためのコードをtryブロックで囲む必要があり、例外処理は で行われcatch(){}ます。

作成がヒープベースの場合 (たとえばnew、デフォルトのアロケーターを使用)、次のように作成の近くに例外処理コードを配置できます。

void f() {
  // work unrelated to Hoge object here

  try {
    Hoge *pHoge = new Hoge(); // could throw an exception
  } catch(HogeException& ex) {
    // handle exception
  }

  // rest of work here
}

tryただし、作成がスタックベースの場合、ブロックのスコープのために、それを行う方法が見つからず、以下のようなコードに頼ることができません。

void g() {
  // work unrelated to Hoge object here

  try {
    Hoge hoge; // could throw an exception

    // rest of work here
  } catch(HogeException& ex) {
    // handle exception
  }
}

上記// rest of workのコードが大きい場合、オブジェクトの作成と例外処理の間の距離が長くなり、コードの可読性が低下する可能性があります...

私は、例外処理コードがオブジェクト作成の近くにあることを好みます (おそらくそれは構造の概念の 1 つですtry) catch。解決策はありますか?

4

2 に答える 2

5

// rest of workをヘルパー関数に委任し、Hoge&その関数にaを渡します。

void RestOfWork(Hoge& hoge)
{
  // rest of work here
}

void g() {
  // work unrelated to Hoge object here

  try {
    Hoge hoge;
    RestOfWork(hoge);
    // rest of work here
  } catch(HogeException& ex) {
    // handle exception
  }
}

ちなみに、Hoge hoge();あなたが思っていることはしません。hogeおそらく、タイプという名前のオブジェクトを宣言しHoge、デフォルトのコンストラクターを呼び出してオブジェクトを初期化していると思うでしょう。hoge実際に行っているのは、パラメーターを受け取らず、値による値を返すという名前の関数を宣言することですHoge。上記のコードでこれを修正しました。

実際、@ LightnessRacesInOrbitで提案されているように、Hogeオブジェクトの構築は、次のように延期関数でも実行できます。

  void RestOfWork()
  {
       Hoge hoge;
      // rest of work here
  }

  void g() {
    // work unrelated to Hoge object here

    try {
      RestOfWork();
    } catch(HogeException& ex) {
      // handle exception
    }
  }
于 2012-11-23T13:49:27.043 に答える
0

これを行うための合理的な方法は、null 許容の単一項目コンテナーを使用することですboost::optional

void g() {
  // work unrelated to Hoge object here

  boost::optional<Hoge> opt_hoge;
  try {
    opt_hoge = boost::in_place<Hoge>();
  } catch(HogeException& ex) {
    // handle exception
  }
  Hoge &hoge = *opt_hoge;

  // rest of work here
}

Boost を使用できない場合std::unique_ptrは、ヒープ割り当てを犠牲にして機能します。

void g() {
  // work unrelated to Hoge object here

  std::unique_ptr<Hoge> opt_hoge;
  try {
    opt_hoge = std::unique_ptr<Hoge>(new Hoge);
  } catch(HogeException& ex) {
    // handle exception
  }
  Hoge &hoge = *opt_hoge;

  // rest of work here
}
于 2012-11-23T14:29:18.053 に答える