- 締切済み
例外処理について
C++初心者の者です。例外処理について質問があります。 例外処理の利点が明確に分かりません。 例外処理を使わなくても、if文でエラーを検出して、 エラー処理をすれば良いではないかと思ってしまいます。 例外処理が有効な状況を教えて頂ければ幸いです。 何卒、宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- toysmith
- ベストアンサー率37% (570/1525)
Cの場合、エラー処理にかかわるすべてのプログラムがエラーの詳細を知っている必要があります。 ・エラー発生場所(当然) ・エラー発見場所(詳細がわからないと適切な対応処理に飛べない) ・エラー対応場所(当然) エラー発見場所はエラー詳細を知っている必要があるのですが、実際にはifやswitchで場合分けしているだけということがほとんどです。 C++の場合、例外エラー処理は発生場所と対応場所だけで行います。 例外エラーが起こりうる範囲をtryブロックで囲むことで例外エラーの発見処理をプログラムから追放することができます。 結果、プログラマは正常ルートのロジックに集中できます。 if (open処理) { エラー処理1//処理全体の中止 } if (read処理) { エラー処理2//close処理の後中止 } if (write処理) { エラー処理3//close処理の後中止 } close処理 よくあるタイプの流れですが、「エラー処理2とエラー処理3は実質同じだ。さて、どう効率化するか?」と余計なロジックを考えなければいけません。 read/writeが複雑に絡み合った場合はもっとややこしいことになります。 read処理とwrite処理をtryブロックとしてしまえば話は簡単になります。 open処理をコンストラクタで実装してしまった場合(決して推奨されませんが)はtryブロックでないとopenエラーの取得すらできません。
- toysmith
- ベストアンサー率37% (570/1525)
同一関数内で同じエラー処理が複数出てくることがあります。 例外処理がサポートされていない場合、「いちいちifでエラー判定して同じエラー処理を何度も書く」か「いちいちifでエラー判定してgoto文でエラー処理ブロックに飛ばす」という対応になります。 (エラー処理を関数化すると言う手もありますが、「インターフェースのためのインターフェースは作ってはならない」という大前提があるので、よほど特殊な状況で無い限り禁じ手です) 値を返すことが不可能な状況(コンストラクタでのエラー発生など)な場合は例外を使わないとエラーの発生を知ることすら出来ません。
補足
早速のお返事ありがとうございます。^^ ですがtoysmithさんの説明してくださった通りに、飲み込めていないかもしれません。 お手数ですがもう一度、ご指導ください。 C言語では、データを処理したい時、データを使う側がif文を使ってエラー判定を行い、 そのエラーに対する対処を記述する。 そのため、データを使う側は、何故エラーが起こるのか(データと処理の詳細)を知らなければならない。 C++言語では、オブジェクト自身が常に(tryした場合だけ!?)エラー判定をしている。 エラーがあった場合、そのオブジェクトは例外をthrowする。 ユーザーは、対処したい例外をcatchし、その対処を記述する。 そのためユーザーは、オブジェクトの内部構造を知らなくても良い。 (ユーザーはオブジェクトが何をthrowするのかを知っており、それに対して、対処を記述するだけである。) こんな感じでしょうか!?^^; toysmithさんには、以前にも助けて頂いた事がございます。今後とも、ご指導宜しくお願いします。