web-dev-qa-db-ja.com

単一の「投げる」とは何ですか。文はしますか?

最近、私はたくさん読んでいます C++ F.A.Q そして特に このページ

セクションを読んで、著者が「例外ディスパッチャー」と呼ぶ「テクニック」を発見しました。これにより、誰かがすべての例外処理を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のその他の「奇妙な」(おそらく良い言葉ではない)使用法はありますか?

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

48
ereOn

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

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

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

47
Alan Stokes

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

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

38
dalle

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

7
sharptooth