最近、私はたくさん読んでいます 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
のその他の「奇妙な」(おそらく良い言葉ではない)使用法はありますか?
ありがとうございました。
_throw;
_を単独で実行し、それを再スローするための現在の例外がない場合、プログラムは突然終了します。 (より具体的には、terminate()
が呼び出されます。)
スローすることに注意してください。現在の例外を再スローする唯一の安全な方法です-それはと同等ではありません
catch (exception const & e) { throw e; }
はい、動作を指定しました。終了を呼び出します。
15.1、パラ8:現在例外が処理されていない場合、オペランドなしでスロー式を実行すると、terminate()(15.5.1)が呼び出されます。
これはいわゆる例外ハンドラです。 「現在の例外」がある場合は、それを再スローします。現在処理されている例外がない場合 terminate()
が呼び出されます 。