try-finally ステートメント
Microsoft 固有の仕様 →
次の構文は try-finally のステートメントを記述して :
__try {
// guarded code
}
__finally {
// termination code
}
文法
try-finally ステートメント :
__try の 複合ステートメント__finally の 複合ステートメント
try-finally のステートメントを C と C++ の言語にコード ブロックの実行が中断されるときにクリーンアップ コードの実行を保証する対象アプリケーションを有効にする Microsoft の拡張機能です。クリーンアップは構成された最後のファイルメモリファイル ハンドルを解放することを解放などのタスクからします。try-finally のステートメントにチェックがルーチンの早期にはが発生する可能性があるエラーに対して実行された複数の場所が指定ルーチンに特に役立ちます。
関連情報とコード例についてはステートメントとを除く を参照してください。一般に構造化例外処理の詳細については構造化例外処理 を参照してください。マネージ アプリケーションでの例外処理の詳細については/clr の下の例外処理 を参照してください。
[!メモ]
構造化例外処理ではC および C++ のどちらのソース ファイルの Win32 を使用します。ただしC++ 向けに設計されていません。コードが C++ 例外処理を使用して汎用性のあることを確認します。またC++ 例外処理は任意の型の例外処理できることよりも柔軟性があります。C++ プログラムではC++ 例外処理機構 (trycatchthrow のステートメント) を使用することをお勧めします。
__try 句で保護されたセクションした後で複合ステートメントを指定します。__finally 句の後の複合ステートメントを終了ハンドラーです。保護されたセクションでは例外ハンドラーが異常終了 () で終了する場合は。標準に流れ落ちるに修正するかどうかを保護されたセクションが終了したときに関係なく実行する一連のアクションを指定します (正常に終了します)。
単純なシーケンシャル実行することで __try ステートメントの数を制御します (流れ落ちるにある)。コントロールが __try を入力すると関連ハンドラーがアクティブになります。制御フローが try ブロックの終わりに達した場合は次のように実行されます :
終了ハンドラーが呼び出されます。
終了ハンドラーが完了すると実行が __finally のステートメントの後に従います。保護されたセクションの使用方法にかかわらず終了する場合は (たとえば保護された本文または return のステートメントから goto と)終了ハンドラーは制御フローが保護されたセクションの外に移動された実行 before です。
__finally のステートメントは適切な例外ハンドラーの検索をブロックします。
例外が __try のブロックで発生するとオペレーティング システムが例外ハンドラーが見つからなかった場合はプログラムは失敗します。ハンドラーがある場合は__finally すべてのブロックとハンドラーの実行を再開が実行されます。
たとえば次の図に示すように機能の一連の関数呼び出しのリンクの関数はを 17 C とします。各関数に 1 人の終了ハンドラーがあります。例外は関数の 17 回以上のターゲットで発生し処理では終了ハンドラーが次の順序でシステムがスタックをアンワインドするときに呼び出されます : 17 CD 1512 C。
終了ハンドラーの実行順序
[!メモ]
try-finally 動作は Finally の使用をサポートする C# などの一部の言語とは異なります。一つの __try は __finally と __except のいずれかが両方を持つ場合があります。一緒に使用する場合ステートメントは内部の外部で try-finally ステートメントを記述する必要があります。各ブロックが実行するときに指定する規則も異なります。
__leave のキーワード
__leave のキーワードは try-finally のステートメントの保護されたセクション内でのみ有効です。また効果は保護されたセクションの末尾に移動します。実行が終了ハンドラーの最初のステートメントで実行が続行されます。
goto のステートメントは保護されたセクションの外部にジャンプする留めるできますがスタック アンワインドを呼び出すためパフォーマンスが低下します。__leave のステートメントはそのスタック アンワインドが発生しないので効率的です。
異常終了
try-finally のステートメントを longjmp のランタイム関数を使用して終了して異常終了と見なされます。__try のステートメントに進むことはできませんが外部にジャンプする留めるための 1 種類のできます。(__try ブロックは正常に終了します) 攻撃開始点でアクティブであり__finally のすべてのステートメントがターゲット (例外を処理 __except ブロック) 実行する。これはローカル アンワインドと呼ばれます。
Try ブロックがスタックをアンワインドするプロセスの一部としてブロックからのジャンプが途中で実行する場合システム Finally に関連付けられたブロックをなんらかの理由で終了します。この場合AbnormalTermination 関数の戻り値は Finally ブロック内で呼び出された場合にします ; それ以外の場合は FALSE を返します。
終了ハンドラーはプロセスが try-finally ステートメントの実行中に殺されれば呼び出されません。
終了 Microsoft 固有の仕様→