ハードウェア例外(アクセス違反とかゼロ除算とか)のハンドリングは、Windowsでは「構造化例外処理(SEH)
」の仕組みで処理しますが、C++標準ではその仕組みを規定していないので通常はtry/catchではキャッチできません。
VC++では、プロジェクトのプロパティの「C/C++」→「コード生成」にある、「C++の例外を有効にする」項目を「はい - SEHの例外あり(/EHa)」に変更することで、C++のcatch(...)でキャッチできるようになっています。また、そのままでは例外の種類別に処理できないので、必要に応じて_set_se_translator
関数で自前の関数を登録します。
ただし、/EHa オプションを指定すると最適化に制限がかかってパフォーマンスの低下につながる可能性があります。パフォーマンスを気にするなら、必要な場所でのみ構造化例外のハンドリングをすることをお勧めします。
VC++では構造化例外処理(SEH)のための構文__try
/__except
が用意されており、Windows APIのGetExceptionCode
関数またはGetExceptionInformation
関数で例外の原因が取得できます。
ご質問のコードを構造化例外処理に置き換えたコード例です。Windows APIを使用するので、windows.h
をインクルードする必要があります。
C++
1for (int i = from; i < to; i++)
2{
3 __try
4 {
5 ptr[(i * 12) + 2] = col.r;
6 ptr[(i * 12) + 3] = col.g;
7 ptr[(i * 12) + 4] = col.b;
8 ptr[(i * 12) + 5] = col.a;
9 }
10 __except(EXCEPTION_EXECUTE_HANDLER)
11 {
12 printf("エラー");
13 }
14}
例外の種類によって処理を分けたい場合はこんな感じになります。
C++
1DWORD code;
2__try
3{
4 // 何かの処理
5}
6__except(code = GetExceptionCode(), EXCEPTION_EXECUTE_HANDLER)
7{
8 switch(code)
9 {
10 case EXCEPTION_ACCESS_VIOLATION:
11 printf("アクセス違反\n");
12 break;
13
14 case EXCEPTION_INT_DIVIDE_BY_ZERO:
15 printf("整数値のゼロ除算\n");
16 break;
17
18 case ……
19 }
20}
詳細はMSDNの「構造化例外処理 (C/C++)」を参照してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/08 22:07