Share via


ステートメント (c)とを除く

Microsoft 固有の仕様 →

とを除く のステートメントはプログラムのコントロールをアプリケーションで取得する C 言語が正常に実行を終了するイベントが発生したときに Microsoft 拡張機能です。このような例外イベントは例外を除き扱うが構造化例外処理と呼ばれる機能と呼ばれます。

例外はハードウェアまたはソフトウェア ベースのいずれかです。アプリケーションがハードウェアまたはソフトウェア例外から完全に回復できない場合でも構造化例外処理ではエラー情報を表示し問題の診断をアプリケーションの内部状態をトラップすることができます。これは簡単に再現できない断続的な問題に特に役立ちます。

構文

  • try ステートメントを除外 :
    __try複合ステートメント

    __except。式の )複合ステートメント

__try 句で保護されたセクションした後で複合ステートメントを指定します。__except 句の後の複合ステートメントで例外ハンドラーです。ハンドラーは例外が保護されたセクションの実行中に発生した場合に実行される一連のアクションを指定します。実行は次のように検索されます :

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

  2. 例外が保護されたセクションの実行中に発生する実行が __except の句の後ろのステートメントから実行します。

  3. 例外が保護されたセクションの任意のルーチンの実行中に発生した保護されたセクションでは__except の式が評価され例外を処理する方法によって返される値。値 3 があります :

    EXCEPTION_CONTINUE_SEARCH の例外は認識されません。次のの優先順位のハンドラーを とを除く のステートメントを含むハンドラーをスタックにまずを検索し続けます。

    EXCEPTION_CONTINUE_EXECUTION の例外が認識されますが終了します。例外が発生した位置で実行を継続します。

    EXCEPTION_EXECUTE_HANDLER の例外が認識されます。__except の複合ステートメントの実行に例外ハンドラーに転送は例外が発生した時点で実行を継続できます。

__except の式は. の式として評価されるため一つの値条件式の演算子またはコンマ演算子に制限されます。より広範な処理が必要な場合式は上記の値 3 から 1 にそのルーチンを呼び出すことができます。

[!メモ]

構造化例外処理ではC および C++ のソース ファイルを使用します。ただしC++ 向けに設計されていません。コードが C++ 例外処理を使用して汎用性のあることを確認します。またC++ 例外処理機構は任意の型の例外処理できるように非常に柔軟性があります。

[!メモ]

C++ プログラムではC++ 例外処理は構造化例外処理を使用する必要があります。詳細についてはC++ 言語リファレンスの 例外処理 を参照してください。

アプリケーションの各ルーチンは独自の例外ハンドラーが見つかったことができます。__except の式は __try 本体のスコープ内で実行します。これになります。そこで宣言されたローカル変数にアクセスできることを示します。

__leave のキーワードは とを除く のステートメント ブロック内で使用できます。__leave の影響は とを除く ブロックの末尾に移動します。実行は例外ハンドラーの末尾の後に再開します。同じ結果を達成するために goto のステートメントは使用できますがgoto のステートメントによってスタックがアンワインドをします。__leave のステートメントはスタック アンワインドが含まれないので効率的です。

とを除く のステートメントを longjmp のランタイム関数を使用して終了して異常終了と見なされます。__try のステートメントに進むことはできませんが外部にジャンプする留めるための 1 種類のできます。例外ハンドラーはプロセスが とを除く ステートメントの実行中に殺されれば呼び出されません。

使用例

ここでは例外ハンドラーと終了ハンドラーの例です。終了ハンドラーに関する詳細についてはtry-finally ステートメント を参照してください。

.
.
.
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                  */

終了 Microsoft 固有の仕様→

参照

関連項目

ステートメントとを除く