__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; } } //---------------------------------------------------------------------------