C++Builder2007とC++Builder2009の__finallyの動作を検証する

気になる記事を見つけたので、動作を検証しました。

catch、__finallyブロックをreturnで抜ける時、それより外にある__finallyブロックは実行されません。__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はあまり使用されていないのかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください