例外のフィルターを記述できます。
例外ハンドラーのレベルにジャンプまたは実行を続けることで例外を処理できます。次に例外ハンドラー コードを流れ落ちるな例外を使用し代わりに処理するため– 1スタックをクリア再開の流れを返すことによって問題をクリーンアップするには フィルターを 使用できます。
[!メモ]
例外を続行できません。 フィルターを 評価するとこのような例外の 1 つがシステム新しい例外を発生させます。RaiseException を呼び出すと例外がするかどうかを指定します。
たとえば次のコードは フィルター式 で関数呼び出しを使用して : 次にこの関数は問題を返します。コントロールのを再開する標準フローに 1) を処理します :
// exceptions_Writing_an_Exception_Filter.cpp
#include <windows.h>
int main() {
int Eval_Exception( int );
__try {}
__except ( Eval_Exception( GetExceptionCode( ))) {
;
}
}
void ResetVars( int ) {}
int Eval_Exception ( int n_except ) {
if ( n_except != STATUS_INTEGER_OVERFLOW &&
n_except != STATUS_FLOAT_OVERFLOW ) // Pass on most exceptions
return EXCEPTION_CONTINUE_SEARCH;
// Execute some code to clean up problem
ResetVars( 0 ); // initializes data to 0
return EXCEPTION_CONTINUE_EXECUTION;
}
フィルター式 で関数を呼び出すことをお勧めたびに複雑な フィルターを 行う必要があります。式を評価すると関数の実行をこの場合Eval_Exception 発生します。
例外を確認 GetExceptionCode を使用しています。フィルター内の関数自体を呼び出す必要があります。Eval_Exception は GetExceptionCode を呼び出すことはできませんが渡された例外コードが必要です。
このハンドラーは他の例外ハンドラーには整数または浮動小数点オーバーフローがあるコントロールを渡します。この場合ハンドラーがあるグローバル変数をリセットするには関数 (ResetVars 例にはAPI 関数) を呼び出します。この例では空である ステートメント ブロックは 2Eval_Exception は EXCEPTION_EXECUTE_HANDLER (1) を返さないため使用することはできません。
関数呼び出しを使用すると複雑なフィルター式を処理する適切な一般的な方法です。有用な 2 つが他の C 言語の機能は次のとおりです :
条件演算子
コンマ演算子
条件演算子は特定のリターン コードを確認し2 種類の値から 1 を返すために使用できるため多くに便利です。たとえば次のコードのフィルターは例外が STATUS_INTEGER_OVERFLOW の場合にのみ例外を認識します :
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0 ) {
条件演算子の目的はこの場合次のコードが同じ結果を生成するため主により明確に提供することです :
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {
条件演算子はフィルターに評価する可能性がある状況では役立ちます。1EXCEPTION_CONTINUE_EXECUTION があります。
コンマ演算子は複数単一の式内の個別の操作を行うことができます。効果はおよそ複数のステートメントを実行し最後の式の値を返すことの場合です。たとえば次のコードでは変数の例外コードを保存しテストします :
__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )