• ベストアンサー

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の部分にはどのような記述がなされるのでしょうか? よろしくお願いします

  • nubou
  • お礼率62% (293/470)

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.6

> 例外処理は主にデバッグのときだけに使われるのでしょうか? > 怪しい処理は最終的にはつかわないようにすると思ったので気になります いえいえ、その言葉どおり「例外的な処理を記述するため」のものです。 たとえば、普通はつながっているはずのマシンと通信するような処理で、たまたま相手が メンテ中で止まっており通信ができない、って場合は、例外で処理するのがスマートです。 # 「怪しい処理」って、なんか、発想が面白い :-) 蛇足になりますが、No.5 の回答について。 layer13> それからもう一つ、JAVAが出てくる前からC++に例外処理は有ります。 layer13> C++が出来たのは1980年代ですからね。その辺りを勘違なさいませぬように。 layer13> #ANSI制定も1995年くらい? c++ は 1980年代の前半からですが、最初は C のソースへのトランスレータとして 実装されました (cfront という)。 最初の頃は、例外も実装されていません。 ANSI C++ は、1997年の11月に採択され、正式に ISO に承認されたのは次の年の春か夏だったと思う。

その他の回答 (5)

  • layer13
  • ベストアンサー率47% (37/78)
回答No.5

気になったのでちょっと調べてみました。 まず、C++の規格にfinallyは存在しません。これは他の方が おっしゃっているように間違いないです。 ただし、Win32で実装されているCベースの構造化例外というものには __finallyというものが存在するようです。要は、処理系(Windows)依存の 拡張ということですね。 おそらく、その本を書いた人がごちゃまぜにして理解せぬまま記述を してしまったのではないかと思います。 念のため、プログラミング言語C++第二版(三版今ちょっと手元になし) でも調べてみましたがfinallyという語句は出てきませんでした。 それからもう一つ、JAVAが出てくる前からC++に例外処理は有ります。 C++が出来たのは1980年代ですからね。その辺りを勘違なさいませぬように。 #ANSI制定も1995年くらい? 以上ご参考までに。

nubou
質問者

お礼

その辺りを勘違なさいませぬように。: その心配はありません javaがまだないときにC++を使ってましたから いろいろ調べいてた抱いてありがとうございました

回答No.4

> 数年前の本しか持っていないのでどこにもtryは乗っていないのです でしたらもっと新しい文献をあたってください。 > std::runtime_errorの構文とstd::exceptionの構文を教えていただければ幸いです ここですべてを解説するのは勘弁してください。

参考URL:
http://www.comnets.rwth-aachen.de/doc/c++std/lib-diagnostics.html#lib.std.exceptions
nubou
質問者

お礼

どうもありがとうございました

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> 私が借りてきたC++辞書にはfinallyが載っています > 多分例外処理は新しく導入されたものでfinallyはさらに新しいもで規格化されたばかりかまた規格として認められていないのでは内科と思われます 変な本。 finally は、ANSI C++ の規格にはありません。 microsoft 拡張では、__try ~ __finally がありますが、あくまでも microsoft オリジナルです。 > try・・・の具体的な簡単プログラミング例を示していただければ幸いです class FooException { }; void foo() {   throw FooException(); } void bar() {   try {     foo();   } catch (FooException& ex) {     // ex を使えます   } } java を知っているのであれば、違和感は無いですよね。 あなたが質問で書いたのとほとんど一緒です。

nubou
質問者

お礼

例外処理は主にデバッグのときだけに使われるのでしょうか? 怪しい処理は最終的にはつかわないようにすると思ったので気になります よろしくお願いします

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

>(1)冷害が発生したときstat4は実行されるのでしょうか? 実行されます。ちなみに、c++ には finally はありません。 >(2)except-declはどうのような記述がなされるのでしょうか? java のように、   catch (クラス名 &受取る変数名) とできます。変数名の前の & はつけておいたほうがよろしい。 java と違って、   catch (...) という書き方ができます。全ての例外をキャッチし、かつ、例外のインスタンスが 必要ない場合です。java なら   catch (Throwable th) と書くのと一緒です。 >(4)例外を発生させる構文 >throw except >(except:発生させる冷害) >のexceptの部分にはどのような記述がなされるのでしょうか? 普通は、   throw 例外のクラス(必要ならコンストラクタのパラメータ); という書き方をします。java チックに   throw new 例外のクラス(...); とやると、catch した側で delete しなければならなくなりますので注意。 > C++にjavaのような例外処理ができるのを知りました # 時の流れを感じます (^^;

nubou
質問者

補足

c++ には finally はありません。: 私が借りてきたC++辞書にはfinallyが載っています 多分例外処理は新しく導入されたものでfinallyはさらに新しいもで規格化されたばかりかまた規格として認められていないのでは内科と思われます try・・・の具体的な簡単プログラミング例を示していただければ幸いです よろしくお願いします

回答No.1

(1) 実行されます (2) catch ( std::exception& err ) // 例 (4) throw std::runtime_error("can't do it"); // 例 # ちゃんとした教科書を読んだほうがいいと思います。

nubou
質問者

お礼

数年前の本しか持っていないのでどこにもtryは乗っていないのです tryは図書より借りたC++辞書ではじめてみました その辞書には上記のような大雑把な構文しか載っていません std::runtime_errorの構文とstd::exceptionの構文を教えていただければ幸いです よろしくお願いします

関連するQ&A

  • 例外処理のフローチャートの記述方法

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

  • 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
  • 例外処理

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

    • ベストアンサー
    • Java
  • DBのコネクションのclose処理で例外が発生した場合

    DBのコネクションのclose処理で例外が発生した場合 DBアクセスが終わった後、finallyでResultSetやConnection、PreparedStatementのclose処理を行うと思います。 } finally { if (result != null) { try { result.close(); } catch (SQLException e) { } } if (ps != null) { try { ps.close(); } catch (SQLException e) { } } if (conn != null) { try { conn.close(); } catch (SQLException e) { } } } 上記では各close処理で例外が発生した場合、何もしていませんがこのあたりの処理は何を行うべきなのでしょうか。 例えばログ出力をして例外をそのまま上位にスローするなどでしょうか。 close処理で例外が発生するのは余程のことだと思うのですが、ログ出力以外で何かやるべき処理はありますでしょうか。

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

  • UWSCでの例外処理について

    趣味で最近UWSCをいじっています。 某サイトに自動ログインするスクリプトを作成しています。 しかしそのサイトはサーバーが混んでいたりすると割と頻繁に「 Error」と出てしまい、スクリプトがそこで止まってしまいます。 よって例外処理のTRY EXCEPT ENDTRYを使用するといいという所まで調べましたが、実際にどう記述していいのか、調べても近いサンプル記述が得られませんでした。 やりたいのはに「 Error」が出たときに再度トップへ戻るという事です。(戻るボタンではなく) TRY MSGBOX(Error) EXCEPT IE.navigate("http://飛ばしたいサイト") ENDTRY であってますでしょうか?よろしくお願いします。

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

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

  • C++の例外処理

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