• 締切済み

例外処理について

C++初心者の者です。例外処理について質問があります。 例外処理の利点が明確に分かりません。 例外処理を使わなくても、if文でエラーを検出して、 エラー処理をすれば良いではないかと思ってしまいます。 例外処理が有効な状況を教えて頂ければ幸いです。 何卒、宜しくお願いします。

みんなの回答

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

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)
回答No.1

同一関数内で同じエラー処理が複数出てくることがあります。 例外処理がサポートされていない場合、「いちいちifでエラー判定して同じエラー処理を何度も書く」か「いちいちifでエラー判定してgoto文でエラー処理ブロックに飛ばす」という対応になります。 (エラー処理を関数化すると言う手もありますが、「インターフェースのためのインターフェースは作ってはならない」という大前提があるので、よほど特殊な状況で無い限り禁じ手です) 値を返すことが不可能な状況(コンストラクタでのエラー発生など)な場合は例外を使わないとエラーの発生を知ることすら出来ません。

__sourin__
質問者

補足

早速のお返事ありがとうございます。^^ ですがtoysmithさんの説明してくださった通りに、飲み込めていないかもしれません。 お手数ですがもう一度、ご指導ください。 C言語では、データを処理したい時、データを使う側がif文を使ってエラー判定を行い、 そのエラーに対する対処を記述する。 そのため、データを使う側は、何故エラーが起こるのか(データと処理の詳細)を知らなければならない。 C++言語では、オブジェクト自身が常に(tryした場合だけ!?)エラー判定をしている。 エラーがあった場合、そのオブジェクトは例外をthrowする。 ユーザーは、対処したい例外をcatchし、その対処を記述する。 そのためユーザーは、オブジェクトの内部構造を知らなくても良い。 (ユーザーはオブジェクトが何をthrowするのかを知っており、それに対して、対処を記述するだけである。) こんな感じでしょうか!?^^; toysmithさんには、以前にも助けて頂いた事がございます。今後とも、ご指導宜しくお願いします。

関連するQ&A

  • 例外処理の書き方がよく分かりません。

    例外処理の書き方がよく分かりません。 普通に書くと↓の(2)のところでエラーが出てしまうと思うのですが、こういった場合の例外処理の書き方が分かりません。 (1)の前に、 if(s2.length == 1) return; を書けば、エラーにはならないと思います。しかし、try catchやthrowsするのが普通のような気がしており、書き方が分かりません。 String str = "inu,neko"; String str2 = "inu"; String[] s = str.split(","); String[] s2 = str2.split(","); s[1].length(); s2[1].length();//(1)

    • ベストアンサー
    • Java
  • PHPの例外処理

    PHPの例外処理について教えてください function test() {   try{    $a = 10;    $b = 0;    $result = $a/$b;   }   catch(Exception $e){    //エラー処理   } } 上記でcatchが実行されるためにはどのようにすれば良いでしょうか?例えば if($b == 0) {   throw new Exception('例外'); } を「$result = $a/$b;」の前に書いておくなどすればcatchされるのはわかりますが、 想定されるすべての例外のthrow処理を記載するなんてことはしたくありません。 実行してエラーだったら自動的にthrowされる、なんていうことはPHPでは無理でしょうか?

    • ベストアンサー
    • PHP
  • C# の例外処理について

    こんにちは。 C#の例外処理について質問させてください。 ある関数の内部において、一般的な例外をユーザー定義の例外に変えて投げ、 この関数の利用者には必ずそのユーザー定義の例外を処理するよう強制したいと思っています。 しかし、C#で関数の利用者に例外処理を強制させる方法が見つかりません。 そもそも、関数の利用者からは、その関数でどのようなユーザー定義の例外が投げられるかすらわからないように思います。 正しくcatchするには関数の中身を追うしかない?と疑問に思っています。 C#ではこのような場合、どうするのが一般的なのでしょうか? Javaでは例外処理の強制は簡単なので、構文が似てるだけに不思議に思っています。 基本的な仕様の見落としだったら申し訳ありませんが、よろしくお願いいたします。

  • 例外処理

    デバッグをしてみました。 すると,try・catch文までしか実行されていないことがわかりました。 public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } 例外処理について調べてはみたものの、なぜこの部分で実行が止まってしまうのか、 解決につながるようなことが,みつかりません。 1.例外処理はどのような処理なのか 2.なぜ、try・catchで実行が終了してしまうのか 教えてください。

    • ベストアンサー
    • Java
  • Javaの例外処理の書き方について

    Javaの例外はErrorとRuntimeExceptionは書かなくてもいいが、 Exceptionはtryでcatchする必要があると聞きました。 しかし、java.langのStringを使っても例外処理は書きません。 なぜ、例外を書くやつと書かないやつがあるのですか? たとえば、java.langを使うとしたら、 ClassNotFoundException CloneNotSupportedException Exception の3つをjava.langを使うメソッドのブロックの上にtry文が必要だと思うのですが。

    • ベストアンサー
    • Java
  • 例外処理があまり使われない理由について

    C++でのプログラミングに関して質問です。 只今勉強中で色々な方のソースを拝見していますが、 参考書や解説サイトにはよく載っている「例外処理(tryとかcatchとか)」を記述したソースを殆ど見ないのですが、 例外処理は使わない方がいいのでしょうか? (処理速度が遅くなるとか、gotoのような暗黙の使ってはいけない理由があるのですかね?) 私自身も面倒なので例外処理は今まで書いたことがないのですが、 例外処理を記述する癖をつけた方がいいでしょうか?

  • 例外処理に関して

    質問なのですが、よろしくお願い致します。 ファイルに空白行があった場合、任意に例外を発生させることをしているのですが、 (例外処理内容:ファイルにログを出力する) 例外が2回キャッチされているようで、2回目にファイル(ログファイル)は既に開かれています。というエラーが出ますが、以下のソースでは、呼出元と呼び出されたメソッドともに例外を処理してしまうのでしょうか? また、どう改善したらいいでしょうか? ご教授よろしくお願い致します。 呼出元 public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Try    Dim cls As New testClass cls.timer1() Catch e as Exception 'ログファイル出力 End Try End Sub 呼び出されるメソッド Public Sub Timer1() try FileOpen(1,"ファイルパス",OpenMode.Input) if Trim(LineInput(1)) = "" Then FileClose(1) Throw New Exception End If Catch e as Exception    'ログファイル出力 End Try End Sub

  • VBSの例外処理について

    VBScriptの例外処理は構文エラー以外にどんなものがありますか? できる限りでいいので教えていただけないでしょうか?? また、VBScriptの例外処理が発生した時に戻り値(%ERRORLEVEL%)が0になるのは何故でしょう? ※後者は素朴な疑問なのでスルーしても結構です。もしご存知でしたら教えてください。 ざっくりとした質問ですが、ご回答宜しくお願い致します。

  • VB2015 例外処理について

    Windows10、VS2015 Community上で、 以下の文で例外処理が発生しました。 PctureBox1.Image.Save("C:fileName.png) この処理は、PictureBox1.Image に画像を内製したものを一度HDDに保存し、 すぐにこのFileを読み込み、別の用途に供するために使います。 これを何度か繰り返していると、以下の例外処理(添付画像1)が発生して、 処理は中断されます。私には、この画像から例外の理由を判断することは 出来ませんでした。 そこで、例外処理を以下のように設けました。 Try PctureBox1.Image.Save("C:fileName.png) Catch ex As Exception System.Console.WriteLine(ex.Message) End Try この結果、処理は、継続され結果的には正しく終了しました。 ただし、例外処理を捕捉した時のMSGは以下の通りです。 'Plan2016.vshost.exe' (CLR v4.0.30319: Plan2016.vshost.exe): 'C:\WINDOWS \Microsoft.Net\assembly\GAC_MSIL\System.Drawing.resources \v4.0_4.0.0.0_ja_b03f5f7f11d50a3a\System.Drawing.resources.dll' が読み込まれました。 モジュールがシンボルなしでビルドされました。 ということで、例外処理を挿入したことにより、処理は最後まで出来ましたが、 このままで終了するには、寝覚めが悪いです。 考えられる問題と、これを回避する方法をご教授頂きたくお願いいたします。

  • 例外処理を条件式として使っていいのですか?

    Java初心者です。 以下の様にしているのですが、 for(int i = 0; i < 10; i++){ try { NullPointerException 例外が出る処理 } catch (NullPointerException e) { break; //e.printStackTrace();//例外をコンソールに表示させない。 } } は、以下のようなforを使うのとどのはどちらがいいのでしょうか。 条件式がたくさん必要な場合があり、catch したほうが楽なような気がします。 for(int i = 0; i < 10; i++){ if(例外が出る処理==null){ break; } } また、安全性はどうなのでしょうか。 根本で間違っているのではないかと思い不安で質問しております。 お詳しい方がおられましたら教えて下さいませんでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう