53

最近、私はC++ FAQ、特にこのページをよく読んでいます。

このセクションを読んで、著者が「例外ディスパッチャー」と呼んでいる「テクニック」を発見しました。これにより、誰かがすべての例外処理を 1 つの便利な関数にグループ化できます。

void handleException()
{
  try {
    throw; // ?!
  }
  catch (MyException& e) {
    //...code to handle MyException...
  }
  catch (YourException& e) {
    //...code to handle YourException...
  }
}

void f()
{
  try {
    //...something that might throw...
  }
  catch (...) {
    handleException();
  }
}

私を悩ませているのは、単一のthrow;ステートメントです。与えられた例を考えると、確かに、それが何をするかは明らかです。最初にキャッチされた例外を再スローし、再度f()処理します。

しかし、節handleException()から実行せずに、それ自体で直接呼び出すとどうなるでしょうか? catch()指定された動作はありますか?

さらにボーナスポイントとして、あなたが知っている他の「奇妙な」(おそらく良い言葉ではない)使用法はthrowありますか?

ありがとうございました。

4

3 に答える 3

52

自分でを実行し、throw;それを再スローするための現在の例外がない場合、プログラムは突然終了します。(より具体的には、terminate()と呼ばれます。)

投げることに注意してください。現在の例外を再スローする唯一の安全な方法です-それはと同等ではありません

catch (exception const & e) { throw e; }

于 2011-03-21T14:07:56.973 に答える
41

はい、動作を指定しました。終了を呼び出します。

15.1、パラ8:現在処理されている例外がない場合、オペランドなしでthrow式を実行すると、terminate()(15.5.1)が呼び出されます。

于 2011-03-21T14:06:35.320 に答える
8

いわゆる例外ハンドラです。「現在の例外」があれば再スローします。現在処理中の例外がない場合terminate()は、 が呼び出されます。

于 2011-03-21T14:05:45.943 に答える