try-finally ステートメント (C)

Microsoft 固有の仕様

try-finally ステートメントは C 言語に対する Microsoft の拡張機能であり、コードのブロックの実行が中断されたときに、アプリケーションがクリーンアップ コードの実行を保証できるようにします。 クリーンアップは、メモリを解放する、ファイルを閉じる、ファイル ハンドルを解放するなどのタスクで構成されます。 try-finally ステートメントは、ルーチンからの不完全な戻りが発生する可能性のあるエラーを複数の場所でチェックするルーチンに特に便利です。

try-finally-statement:
__try compound-statement __finally compound-statement

__try 句の後の複合ステートメントは、保護されたセクションです。 __finally 句の後の複合ステートメントは、終了ハンドラーです。 ハンドラーによって、保護されたセクションが終了したときに実行する一連のアクションを指定します。 保護されたセクションが例外によって終了したか (異常終了)、または標準のフォール スルーによって終了したか (通常終了) は関係ありません。

制御は、単純な順次実行 (フォール スルー) によって __try ステートメントに到達します。 制御が __try ステートメントに入ると、関連付けられたハンドラーがアクティブになります。 次のように実行されます。

  1. 保護されたセクションが実行されます。

  2. 終了ハンドラーが呼び出されます。

  3. 終了ハンドラーが完了すると、__finally ステートメントの後から実行が続けられます。 保護されたセクションがどのように終了したか (保護された本体の外への goto ステートメントによってか、 return ステートメントによってか、など) に関係なく、終了ハンドラーは、制御フローが保護されたセクションの外部に移動する前に実行されます。

__leave キーワードは、try-finally ステートメント ブロック内で有効です。 __leave の効果は、try-finally ブロックの末尾に移動することです。 終了ハンドラーはすぐに実行されます。 goto ステートメントを使用しても同じ結果が得られますが、goto ステートメントではスタックがアンワインドされます。 __leave ステートメントは、スタック アンワインドを伴わないため、より効率的です。

try-finally ステートメントを、return ステートメントまたは longjmp ランタイム関数を使用して終了すると、異常終了と見なされます。 __try ステートメントにジャンプして入ることはできませんが、このステートメントからジャンプして出ることはできます。 出発点から処理が向かう先までのアクティブなすべての __finally ステートメントを実行する必要があります。 これは、"ローカル アンワインド" と呼ばれます。

終了ハンドラーは、try-finally ステートメントの実行中にプロセスが中止された場合は呼び出されません。

注意

構造化例外処理は、C および C++ のソース ファイルに機能します。 ただし、特に C++ 用にデザインされたものではありません。 移植可能な C++ プログラムでは、構造化例外処理ではなく、C++ 例外処理を使用する必要があります。 また、C++ 例外処理メカニズムは、任意の型の例外を処理できるという点で、より柔軟です。 詳細については、「C++ 言語リファレンス」の例外処理に関する記事をご覧ください。

try-finally ステートメントの動作を確認するには、try-except ステートメントの例をご覧ください。

Microsoft 固有の仕様の終了

関連項目

try-finally ステートメント (C++)