11項 デストラクターから出る例外を抑える

デストラクターから出る例外を抑える



ある例外が発生している時、別の例外が発生すると、terminate()が呼び出されます。terminate()は局所オブジェクトを解体せずにプログラムを強制終了させるため、避けるべきです。

例外の伝搬によりデストラクタが呼び出された時、そのデストラクタの中で発生した例外を伝搬させると、複数の例外が同時に存在するため、terminate()が呼び出されます。

解決策は、デストラクタの中で発生した例外を補足し、なにもしないことです。

Session::~Session
{
    try{
        logDestruction(this); //ここで例外が発生することがある。
    }
    catch(...){}//補足するだけにする。
}

catchの処理を空にするのは、catch内で例外が発生するのを防ぐためです。



terminate()が呼ばれることを防ぐ以外に、デストラクタ内部からの例外を伝搬させないべき理由として、例外発生以降の処理が行われないということがあります。

Session::~Session
{
    logDestruction(this); //ここで例外が発生すると
    endTransaction();   //この処理は行われない。
}