例外ハンドラーの構文
__try と __except キーワード (keyword) は、フレーム ベースの例外ハンドラーを構築するために使用されます。 次の例は、例外ハンドラーの構造を示しています。
__try
{
// guarded body of code
}
__except (filter-expression)
{
// exception-handler block
}
__try ブロックと例外ハンドラー ブロックには中かっこ ({}) が必要であることに注意してください。 goto ステートメントを使用して __try ブロックの本文にジャンプしたり、例外ハンドラー ブロックにジャンプしたりすることはできません。 この規則は、例外ハンドラーと終了ハンドラーの両方に適用されます。
__try ブロックには、例外ハンドラーが保護するコードの保護された本文が含まれています。 関数には任意の数の例外ハンドラーを含めることができ、これらの例外処理ステートメントは同じ関数内または異なる関数内にネストできます。 __try ブロック内で例外が発生した場合、システムは制御を受け取り、例外ハンドラーの検索を開始します。 この検索の詳細については、「例外処理」を参照してください。
例外ハンドラーは、1 つのスレッド内で発生する例外のみを受け取ります。 つまり、__try ブロックに CreateProcess 関数または CreateThread 関数の呼び出しが含まれている場合、新しいプロセスまたはスレッド内で発生する例外はこのハンドラーにディスパッチされません。
システムは、例外が処理されるかハンドラーがなくなるまで、例外が発生したコードを保護する各例外ハンドラーのフィルター式を評価します。 フィルター式は、次の 3 つの値のいずれかとして評価する必要があります。
Value | 意味 |
---|---|
EXCEPTION_EXECUTE_HANDLER | システムは例外ハンドラーに制御を転送し、ハンドラーが見つかったスタック フレームで実行が続行されます。 |
EXCEPTION_CONTINUE_SEARCH | システムは引き続きハンドラーを検索します。 |
EXCEPTION_CONTINUE_EXECUTION | システムはハンドラーの検索を停止し、例外が発生した時点まで制御を返します。 例外がコンティニュアブルでない場合は、EXCEPTION_NONCONTINUABLE_EXCEPTION 例外が発生します。 |
フィルター式は、例外が別の関数で発生した場合でも、例外ハンドラーが配置されている関数のコンテキストで評価されます。 つまり、フィルター式は関数のローカル変数にアクセスできます。 同様に、例外ハンドラー ブロックは、それが配置されている関数のローカル変数にアクセスできます。
その他の例については、「例外ハンドラーの使用」を参照してください。
フィルター式とフィルター関数の詳細については、「フレーム ベースの例外処理」を参照してください。