構造化例外の処理(C++)
Win32 の構造化例外(C++) への移動
C++ 例外処理の拡張を用いて、構造化例外を処理できます。
try {
foo();
}
__except (__expr__) {
// handler here
}
__expr__
は、評価結果が以下の 3 つの値のいずれかになる式です。
値 | 説明 |
---|---|
EXCEPTION_CONTINUE_SEARCH(0) | ハンドラに制御が移らず、OS が例外ハンドラの検索を続行します。 |
EXCEPTION_CONTINUE_EXECUTION(-1) | 例外発生箇所から実行を続けます。 |
EXCEPTION_EXECUTE_HANDLER(1) | 例外ハンドラに制御が移ります。デストラクタによるクリーンアップを有効にしてコードをコンパイルした場合は(-xd を指定。デフォルトでオン)、スタックが巻き戻されたとき、例外発生時点から例外ハンドラの実行開始時までに生成されたローカル オブジェクトのデストラクタがすべて呼び出されます。スタックの巻き戻しは、ハンドラに制御が移る前に完了します。
|
#include <Windows.h>
#include <excpt.h>
int filter_func(EXCEPTION_POINTERS *);
// ...
EXCEPTION_POINTERS * xp = 0;
try {
foo();
}
__except (filter_func(xp = GetExceptionInformation())) {
// ...
}
あるいは、関数呼び出しの中で代入を行うよりコンマ演算子を使用する方がよければ、以下の例を参照してください。
__except ((xp = GetExceptionInformation()), filter_func(xp))