Microsoft 固有の仕様
try-except ステートメントは、C 言語に対する Microsoft の拡張機能であり、通常は実行を終了するイベントが発生したときにアプリケーションがプログラムを制御できるようにします。 このようなイベントは例外と呼ばれ、例外を処理するメカニズムは構造化例外処理と呼ばれます。
例外は、ハードウェアベースでもソフトウェアベースでもかまいません。 アプリケーションがハードウェアまたはソフトウェアの例外から完全に復旧できない場合でも、構造化例外処理を使用すると、エラー情報をログに記録して表示できます。 問題の診断に役立つアプリケーションの内部状態をトラップすると便利です。 特に、再現が容易ではない断続的な問題に役立ちます。
構文
try-except-statement:
__trycompound-statement__except (expression)compound-statement
__try句の後の複合ステートメントは、保護されたセクションです。
__except句の後の複合ステートメントが例外ハンドラーです。 ハンドラーは、保護されたセクションの実行中に例外が発生した場合に実行する一連のアクションを指定します。 実行は次のように実行されます。
保護されたセクションが実行されます。
保護されたセクションの実行中に例外が発生しない場合は、
__except句の後のステートメントで実行が続行されます。保護されたセクションの実行中、または保護されたセクション呼び出しのルーチンで例外が発生した場合、
__except式が評価されます。 返される値によって、例外の処理方法が決まります。 指定可能な 3 つの値は次のとおりです。EXCEPTION_CONTINUE_SEARCH: 例外が認識されません。 引き続きスタックでハンドラーを検索し、最初にtry-exceptステートメントを含み、次に優先順位が最も高いハンドラーを検索します。EXCEPTION_CONTINUE_EXECUTION: 例外は認識されますが、無視されます。 例外が発生した時点で実行を続行します。EXCEPTION_EXECUTE_HANDLER例外が認識されます。__except複合ステートメントを実行して例外ハンドラーに制御を転送し、例外が発生した時点で実行を続行します。
__except式は C 式として評価されるため、1 つの値、条件式演算子、またはコンマ演算子のいずれかに制限されます。 より広範な処理が必要な場合、式は上記の 3 つの値のいずれかを返すルーチンを呼び出すことができます。
注
構造化例外処理は、C および C++ ソース ファイルで動作します。 ただし、C++ 向けに特別に設計されているわけではありません。 移植可能な C++ プログラムの場合は、構造化例外処理の代わりに C++ 例外処理を使用する必要があります。 また、C++ 例外処理メカニズムは、任意の型の例外を処理できる点で、はるかに柔軟です。 詳細については、「C++ 言語リファレンス」の例外処理を参照してください。
アプリケーション内の各ルーチンは、独自の例外ハンドラーを持つことができます。
__except式は、__try本文のスコープ内で実行されます。 そこで宣言されているローカル変数にアクセスできます。
__leave キーワードは、try-except ステートメント ブロック内で有効です。
__leaveの効果は、try-except ブロックの末尾にジャンプすることです。 例外ハンドラーの終了後、実行が再開されます。
goto ステートメントを使用して同じ結果を得ることができますが、goto ステートメントを使用するとスタック アンワインドが発生します。
__leave ステートメントはスタック アンワインドを伴わないため、より効率的です。
longjmpランタイム関数を使用して try-except ステートメントを終了すると、異常終了と見なされます。
__tryステートメントに飛び込むのは適していませんが、1 つから飛び出すのは有効です。
try-except ステートメントの実行中にプロセスが強制終了された場合、例外ハンドラーは呼び出されません。
例
例外ハンドラーと終了ハンドラーの例を次に示します。 終了ハンドラーの詳細については、 try-finally ステートメント (C) を参照してください。
.
.
.
puts("hello");
__try {
puts("in try");
__try {
puts("in try");
RAISE_AN_EXCEPTION();
} __finally {
puts("in finally");
}
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
puts("in except");
}
puts("world");
例の出力を次に示します。右側に解説が追加されています。
hello
in try /* fall into try */
in try /* fall into nested try */
in filter /* execute filter; returns 1 so accept */
in finally /* unwind nested finally */
in except /* transfer control to selected handler */
world /* flow out of handler */
END Microsoft 固有