__finallyブロックを必ず実行する

catch、__finallyブロックをreturnで抜ける時、それより外にある__finallyブロックは実行されません。__finallyブロックであっても必ず実行されるわけではないので、注意が必要です。これが正式な仕様なのかどうかはわかりません。

__finallyブロックが必ずしも実行されないコード1:

//---------------------------------------------------------------------------
void __fastcall TForm1::Perform()
{
        try {
                try {
                        // ...
                }
                catch(...) {
                        // ...
                        // 外側の__finallyブロックが実行されることを期待している
                        // しかし、returnで抜けるので外側の__finallyブロックは実行されない
                        return;
                }
        }
        __finally {
                // このブロックは必ずしも実行されない
                // ...
        }
}
//---------------------------------------------------------------------------
__finallyブロックが必ずしも実行されないコード2:
//---------------------------------------------------------------------------
void __fastcall TForm1::Perform()
{
        try {
                try {
                        // ...
                }
                __finally {
                        // ...
                        // 外側の__finallyブロックが実行されることを期待している
                        // しかし、returnで抜けるので外側の__finallyブロックは実行されない
                        return;
                }
        }
        __finally {
                // このブロックは必ずしも実行されない
                // ...
        }
}
//---------------------------------------------------------------------------
__finallyブロックを必ず実行するには、catch、__finallyブロックからreturnで抜けるより先に、目的の__finallyブロックが実行されるようにします。

__finallyブロックが必ず実行されるようにしたコード:

//---------------------------------------------------------------------------
void __fastcall TForm1::Perform()
{
        try {
                try {
                        // ...
                }
                __finally {
                        // 必ず実行される
                        // ...
                }
        }
        catch(...) {
                // ...
                return;
        }
}
//---------------------------------------------------------------------------
最終更新: 2008-07-06

戻る