気になる記事を見つけたので、動作を検証しました。
catch、__finallyブロックをreturnで抜ける時、それより外にある__finallyブロックは実行されません。__finallyブロックであっても必ず実行されるわけではないので、注意が必要です。
__finallyブロックが必ずしも実行されないコード1:
try {
try {
throw "error";
} catch(...) {
return 0;
}
} __finally {
std::puts("finally");
}
C++Builder2007、C++Builder2009ともに、__finallyブロックは実行されました。
期待通りの動作です。
__finallyブロックが必ずしも実行されないコード2:
try {
try {
} __finally {
return 0;
}
} __finally {
std::puts("finally");
}
C++Builder2007では、__finallyブロックは実行されました。
期待通りの動作です。
C++Builder2009では、次のコンパイルエラーが発生しました。
[BCC32 エラー] File1.cpp(16): E2551 リターン文は _finally ブロックでは使用できない
C++Builder2009で仕様が変更されたのでしょうか。
C++ではRAIIが使えますから、__finallyはあまり使用されていないのかもしれません。