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