ソフトウェアの例外の発生
プログラム内のエラーの一般的な原因の一部はシステムによって例外としてフラグが設定されません。たとえばメモリ ブロックを割り当てるとメモリが不足している場合実行時または API の関数はエラー コードは例外は発生しません。
ただし例外としてコードの条件を検出しRaiseException の関数を呼び出してそれを報告することにより条件を処理できます。エラーにフラグを設定することによってこれにより任意のランタイム エラーに構造化例外処理の利点を活用できます。
エラーの構造化例外処理を使用するには :
イベントの独自の例外コードを定義します。
問題を検出するときに呼び出します RaiseException。
は例外処理は定義した例外コードを調べるにはフィルター処理します。
WINERROR.H ファイルは例外コードの書式を示します。既存の例外コードと競合するコードを定義しないようにするには1. に番目の最も重要なビット設定します。4 個の最上位ビットは次の表に示すように設定する必要があります。
ビット |
推奨されるバイナリ設定 |
Description |
---|---|---|
31-30 |
11 |
この二つのビットはコードの基本的な条件を記述します : 11 =エラー = 00 正常終了01 = 10 = 情報警告します。 |
29 |
1 |
クライアント ビット。ユーザー定義のコードは1 に設定します。 |
28 |
0 |
予約ビット。(0 への許可セット)。 |
「エラー」設定がほとんどの例外に対して適切である場合は 11 以外の設定がバイナリに最初の 2 ビットを設定できます。コーディングおかなければならないは前の表に示すようにビット 29 および 28 を設定します。
この結果エラー コードは 16 進数の図に最高 4 ビットが設定されている必要があります。たとえば次の定義はWindows の例外コードと競合しない例外コードを定義します。ただしコードがサード パーティの DLL に使用されるかをチェックする必要があります)。
#define STATUS_INSUFFICIENT_MEM 0xE0000001
#define STATUS_FILE_BAD_FORMAT 0xE0000002
例外コードを定義したら例外を発生させるために使用できます。たとえば次のコードはメモリ割り当ての問題に応じて STATUS_INSUFFICIENT_MEM の例外が発生します :
lpstr = _malloc( nBufferSize );
if (lpstr == NULL)
RaiseException( STATUS_INSUFFICIENT_MEM, 0, 0, 0);
例外を発生させた場合は 0 に最後の 3 回のパラメーターを設定できます。3 個の最後のパラメーターは追加情報を渡すとハンドラーが実行を継続するフラグを設定するときに使用します。詳細についてはWindows SDK の RaiseException の関数を参照してください。
例外処理のフィルターで定義したコードのようにテストできます。次に例を示します。
__try {
...
}
__except (GetExceptionCode() == STATUS_INSUFFICIENT_MEM ||
GetExceptionCode() == STATUS_FILE_BAD_FORMAT )