例外階層の配置方法によっては、throwステートメントで例外変数に名前を付けて例外を再スローすると、元の例外オブジェクトがスライスされる場合があります。
引数なしのthrow式は、動的型を保持する現在の例外オブジェクトをスローしますが、引数付きのthrow式は、引数の静的型に基づいて新しい例外をスローしthrowます。
例えば
int main()
{
try
{
try
{
throw Derived();
}
catch (Base& b)
{
std::cout << "Caught a reference to base\n";
b.print(std::cout);
throw b;
}
}
catch (Base& b)
{
std::cout << "Caught a reference to base\n";
b.print(std::cout);
}
return 0;
}
上で書いたように、プログラムは以下を出力します:
ベースへの参照をキャッチしました
派生
ベースへの参照をキャッチしました
ベース
throw bがで置き換えられた場合throw、外側のキャッチは最初にスローされたDerived例外もキャッチします。これは、内部クラスがBase参照ではなく値で例外をキャッチする場合にも当てはまります。ただし、当然、これは元の例外オブジェクトを変更できないことを意味するため、への変更は外部ブロックでキャッチさbれた例外に反映されません。Derived