• 締切済み

例外処理があまり使われない理由について

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

みんなの回答

回答No.4

> if文で処理するよりもcatchしたときに処理時間が何倍もかかるようですし、 > 速度を求める為にC言語系を使ってる人も多いので、 > それも影響してるのでしょうか・・・。 そりゃ事態を想定できて適切に処理するためのコードを処理時間が短い方法で書けるんだったらそうすべき。 そっから漏れるケースを例外処理にて行えば?

hiroko_ss
質問者

お礼

プログラムの恐ろしいところは 想定外のエラーの発生によってバグが生まれることですからね。

  • xyz846
  • ベストアンサー率27% (15/55)
回答No.3

>例外処理は使わない方がいいのでしょうか? 例外処理に関する例題には必要だろうけど それ以外の部分でわざわざ例外処理をして例題のソースを 長くする意味があると思いますか? 例題は伝えたい処理の内容を簡潔にわかりやすくするために例として用意されているものだからです。 Aって事を説明するためにBやCも書いてあったらソースを理解するのが面倒でAと言う要点がぼやけるとだと思いませんか?

hiroko_ss
質問者

お礼

ご回答ありがとうございます。 確かにそうでですよね。 ただ、ゲームやフリーソフトのほぼ完成したプログラムでも 例外処理されていないものが多いので気になりました。 その点は補足不足で申し訳ないです。

  • COOL_K2
  • ベストアンサー率21% (5/23)
回答No.2

よ~く考えろ。 もし例外的なデータが、 アンタのプログラムに流されたとしたら、 あんたのプログラムはどうなる? オマエさんのプログラムと一緒にOSまで落ちたら オマエさんはシアワセか? それを考えるのが例外処理だ。 んで、それをテストするのが異常系テストだ。 C++に限らず、ソフトウェアを作る際に、 いちばんPGを困らせ、一番胃が痛くなるところだ。 ちなみにそこらへんを美しくコーディングする人間を、 俺はネ申と呼ぶ。 ガンガレ。

hiroko_ss
質問者

お礼

ご回答ありがとうございます。 ユーザーはやっちゃいけないことをやりたがりますからね。 予期しないオーバーフローや、メモリ不足は、厄介物です。 そこまでは例外処理というものが存在する理由です。 しかし、実際に使われているのが少ないのは何故なのか。 そこが一番の疑問点です。 #1の方の回答では、多くの人に提供するライブラリ等であれば 使われているようではありますが・・・ やはり面倒というか、コストに見合わないのですかね。 どこかのサイトで見たような気がするのですが、 if文で処理するよりもcatchしたときに処理時間が何倍もかかるようですし、 速度を求める為にC言語系を使ってる人も多いので、 それも影響してるのでしょうか・・・。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> 参考書や解説サイトにはよく載っている「例外処理(tryとかcatchとか)」を記述したソースを殆ど見ないのですが、 どんなソースを見たのでしょうか? 標準C++ライブラリやBoost C++ Librariesを使ったソース(および、それらライブラリ自体)を見れば、まともなプログラムなら例外処理を意識しているはずです。 > 例外処理は使わない方がいいのでしょうか? そんなことはありません。 しっかり使いこなせるようにしましょう。 特に、「例外安全」については重要の概念ですので、よく理解するようにしてください。

hiroko_ss
質問者

お礼

ご回答ありがとうございます。 >どんなソースを見たのでしょうか? 主にゲーム関係やWindowsAPIを使ったアプリのプログラムです。 色々なアルゴリズムやデータ管理方法が実装されていますので、 参考には重宝しています。 が、例外処理は殆ど見たことがありません。 標準ライブラリやBoostはまだ理解できるレベルに到達していないので見たことはないのですが、 Microsoftは速度よりもセキュリティを重視してるので、 その当たりが関係してるのでしょうかね・・・。 例外処理は使ってはいけないものみたいな認識があったのですが、 例外処理はする癖をつけた方がいいですよね。

関連するQ&A

  • 例外処理がまったくわかりません!!

    下のプログラミングについていくつか質問があります。 (1)etest()メソッドってなんですか? (2)存在しないファイルを開くってどういうことですか? (3)FileReader( )対応catch節、Close( )対応catch節ってなんですか? (4)あと、プログラミングあとの本の解説の部分がよくわかりません。抜粋してみます。 「一般的な例外クラスはxxxExceptionというクラス名をしています。このタイプの例外クラスはみな「Exception例外クラス」をスーパークラスにしています。この場合、「catch(Exception e)」を使うとすべてのxxxException例外を補足できるという仕様になっています。ですから下のetest( )メソッドは次のように、ひとつのcatch節で記述することができます。このようにしても表示される4エラーメッセージ(eで指示)は、正しく発生例外(FileNotFoundExceptionまたはIOException) 対応のものになります。」 public static void etest( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } よろしくお願いします。

    • ベストアンサー
    • Java
  • 例外処理のフローチャートの記述方法

    例外処理のフローチャートを記述したいのですが、良い記述方法はないでしょうか? try、catch、throwの記述方法等教えていただければ幸いです。 #JISで決められている図でtry、catch、throwに該当する図はないと思います。 #わかりやすければ、独自の図などでも構いませんので、アドバイスお願いします。

  • 例外処理

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

    • ベストアンサー
    • Java
  • phpの例外処理がエラーをトラップしてくれない。

    以下のように例外処理を記述しした場合、 try{ //ここでエラー } catch (Exception $e){ $ErrorMsg="その他エラー:".$e->getMessage(); } tryの中で、0除算によるエラーが発生してもエラーをトラップして、例外 処理のcatchに飛びません。 どのように記述すればエラーをトラップできるのでしょか?

    • ベストアンサー
    • PHP
  • 例外処理に関して

    質問なのですが、よろしくお願い致します。 ファイルに空白行があった場合、任意に例外を発生させることをしているのですが、 (例外処理内容:ファイルにログを出力する) 例外が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

  • C++の例外処理について

    C++にjavaのような例外処理ができるのを知りました 構文は try { stat1 } catch(except-decl) { stat2 } finally { stat3 } stat4 ただし stat1:例外が発生する可能性があるステートメント stat2:例外が発生したときに実行するステートメント stat3:例外が発生しなくても実行するステートメント stat4:ステートメント except-decl:捕獲する例外の宣言 です ここで質問です (1) 冷害が発生したときstat4は実行されるのでしょうか? されない場合にはその後どう言う処理がなされるのでしょうか? (2) except-declはどうのような記述がなされるのでしょうか? (4) 例外を発生させる構文 throw except (except:発生させる冷害) のexceptの部分にはどのような記述がなされるのでしょうか? よろしくお願いします

  • UMLでの例外処理

    UML(特にシーケンス図)の作成時に 例外処理をどのように記述すればよいかわかりません。 try-catchをシーケンス図上でどのように記述すればよろしいでしょうか? よろしくお願いします。

  • Javaの例外処理の書き方について

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

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

    お世話になります。 現在C++でプログラミングを行っていますが、例外処理で困っています。 次のようなコードを書きました。 try{   m_Session.DestroyDatabasePool();   }catch(CException e){   m_Share.WriteLogFile("キャッチ中", LOG_INFO ); } しかし、これだとcatchが行われず、catch(CException e)部分を(...)にすると例外処理が実行されます。 例外の詳細を知りたいので、どうしても(CException e)で行いたいです。 説明が不十分かもしれませんが、何かご存知でしたら、ご教授お願いします。

  • close()で例外が投げられる理由

    最近、Java を勉強しはじめておるのですが、ファイル入出力処理で例えば、out.txt なるファイルを出力するサンプルとして FileWriter out = null; try {  wt = new FileWriter("out.txt");  out.write("はろー"); } catch ( IOException e ) {  e.printStackTrace(); } finally {  try {   if (out != null ) out.close();  } catch (IOException e) {   e.printStackTrace();  } } という風に、FileWriter オブジェクト out をクローズする時に IOException 例外が投げられる可能性に対処するため、try / catch でこれをつかまえるように、と聞きました。 そして驚くべきことに、close() が例外を投げた時の catch 節には特に書くべき処理はない、というのです。 そこで質問です。 1. 本当に FileWriter#close() の IOException 例外に対処するためのコードは不要なのですか?(常に握り潰しているだけ?) 2. 対処するコードが不要なら、そもそも FileWriter#close() が IOException 例外を投げる必要がないのではないですか? 長文失礼しました。

専門家に質問してみよう