rethrowing exceptions。

catchした例外を、再び上位の呼び出し元へ送出すること。

概要

例外をcatchした場所で完全に処理できない場合でも、

  • ログだけ残したい
  • 一部の後始末だけしたい
  • 最終的な処理は呼び出し元に任せたい

ことがある。

そのような場合に、いったん受け取った例外を再送出する。

同じ例外を再送出する

同じ例外をそのまま再送出したい場合は、引数なしのthrow;を使う。

try
{
    throw;
}
catch (const std::exception& exception)
{
    std::cerr << "log\n";
    throw;
}

throw;は、現在処理中の例外オブジェクトそのものを再送出する。

新しい例外を送出する

catchの中で、別の例外を新しく送出することもできる。

catch (const std::exception& exception)
{
    throw std::runtime_error{ "another error" };
}

これは再送出というより、受け取った例外を別の例外に変えて送出している。

catchした変数をそのままthrow exception;で送出すると、現在の例外をそのまま再送出しているのではなく、その変数から新しい例外オブジェクトを作って送出することになる。

catch (Base& exception)
{
    throw exception;
}

この場合、実際にはBase型の例外として投げ直されるため、元がDerived型だったときにはオブジェクトスライシングが起こることがある。

そのため、同じ例外をそのまま上位へ渡したいときは、throw exception;ではなくthrow;を使う。

注意

throw;は、catchブロックの外では使えない。
現在処理中の例外が存在しない場所で使うと、プログラムはstd::terminateされる。

関連

参考