次の方法で共有


例外ハンドラーの構文

__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 例外が発生します。

 

フィルター式は、例外が別の関数で発生した場合でも、例外ハンドラーが配置されている関数のコンテキストで評価されます。 つまり、フィルター式は関数のローカル変数にアクセスできます。 同様に、例外ハンドラー ブロックは、それが配置されている関数のローカル変数にアクセスできます。

その他の例については、「例外ハンドラーの使用」を参照してください。

フィルター式とフィルター関数の詳細については、「フレーム ベースの例外処理」を参照してください。