すでに述べたように、それは可能ですが、これで「フォールスルー」スキームを確認する必要があります。最初のtry-catch-blockで例外がキャッチされた場合、外側のcatch-blockによってキャッチされません。ただし、内側のキャッチブロックにキャッチされない場合は、外側のキャッチブロックで一致する例外ハンドラーを見つけようとします。
throw;
内部の例外ハンドラで使用することにより、例外を明示的に次の例外ハンドラに上げることもできます。
たとえば、次のコード:
try
{
try
{
throw std::runtime_error("Test");
}
catch (std::runtime_error& e)
{
std::cerr << "Inner Exception-Handler: " << e.what() << std::endl;
throw;
}
}
catch (std::exception& e)
{
std::cerr << "Outer Exception-Handler: " << e.what() << std::endl;
}
結果は次のようになります。
内部例外ハンドラ:テスト
外部例外ハンドラ:テスト
これが機能するのは、 std::runtime_errorがstd::exceptionから派生しているためです。このような些細な例では、catch-blockを次々に書き込むことも可能ですが、最初のcatch-blockの後に他のコードを実行する場合は、それらをネストする必要があることにも注意してください。