質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

14823閲覧

try catchの使い方がいまいちよくわかりません

seri

総合スコア422

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/09/07 16:40

以下★の部分でエラーが起きるため、try,catch内にはさんだのですが("エラー")の文字はプリントされません。
ちなみにptrはポインタで受け取った値です

C++

1 2 for (int i = from; i < to; i++) { 3 try { 4 ★ ptr[(i * 12) + 2] = col.r; 5 ptr[(i * 12) + 3] = col.g; 6 ptr[(i * 12) + 4] = col.b; 7 ptr[(i * 12) + 5] = col.a; 8 } 9 catch (...) { 10 printf("エラー"); 11 } 12}

環境はVisualStudio,OFです

0x01070223 で例外がスローされました (myFile_debug.exe 内): 0xC0000005: 場所 0x0749FDA8 への書き込み中にアクセス違反が発生しました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ハードウェア例外(アクセス違反とかゼロ除算とか)のハンドリングは、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/07 22:09

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seri

2016/09/08 22:07

ありがとうございます、とてもわかりやすく細かにかいていただいたためベストアンサーとさせていただきます。
guest

0

VCには、C++の例外と、OS提供の例外を扱う構造化例外の2種類の例外が機構が存在し、構造化例外を捕まえるにはtry catch とは別の構文の__try __exceptを使用します。

C++

1__try compound-statement 2__except ( expression ) compound-statement

アクセス不能な不正ポインタへのアクセスで発生するような例外は、C++例外では無く、構造化例外の例外となります。

投稿2016/09/07 22:07

KenjiToriumi

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問