• 締切済み

C++のtryとcatch

C++で、例外処理としてtryがあるのですが、どういった使い方をするのでしょうか? それと、catchも使い方がわかりません。 どなたか教えてください。 よろしくお願いします。

みんなの回答

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

「例外」自体が分からない、ということでしょうか、それとも「例外」はなんとなく 理解しているが、try と catch が分からないんでしょうか。 例外とは、その名の通り、こんなはずではなかった、ということを表すものです。 つまり、予期せず起こるものです。 でも、例外が起きたときの対処は、それぞれに対して1対1で対処法があると いうよりは、細かいことは気にせずまとめて処理できることの方が多いです。 「こんなはずではなかった!」というときには、例外を *投げます* (throw)。 投げられた例外は、例外の後始末をする誰かが *受け取ります* (catch) 。 例外を受け取るために、範囲が指定できます。例外が起きるかどうか試してみる という意味で try というブロックがあります。 例外は概念で、例外の実体にはクラスを指定できます。 下に示すプログラムは、ふたつ数字を入力して割り算をした結果を表示する ものです。0では割れませんから、そのときは例外としています。雰囲気が 分かるでしょうか? #include <iostream.h> class ExceptionDivideByZero { private:   int x_, y_; public:   ExceptionDivideByZero(int x, int y) : x_(x), y_(y) {}   void printMessage(); }; void ExceptionDivideByZero::printMessage() {   cout << "Divide By Zero. " << x_ << " / " << y_ << endl; } int divide_number(int a, int b) {   if (b == 0) {     throw ExceptionDivideByZero(a, b);   }   return a / b; } int main() {   int a, b, c;   try {     cerr << "a: "; cin >> a;     cerr << "b: "; cin >> b;     c = divide_number(a, b);     cout << "a / b = " << c << endl;   } catch (ExceptionDivideByZero ex) {     ex.printMessage();   }   return 0; } ★実行結果 $ prog a: 4 b: 2 a / b = 2 $ prog a: 5 b: 0 Divide By Zero. 5 / 0 # 「伝わるかな~」という意味で自信無しにしておきます

関連するQ&A

  • try catchについて

    try catchの動きで質問があります。 以下が簡略化したソースです。 -------ここから--------------------- ストリーム1; ストリーム2; try{ try{ //ストリーム1を使った処理 }catch(IOException e){ throw e; }finally{ //ストリーム1のクローズ } try{ //ストリーム2を使った処理 }finally{ //ストリーム2のクローズ } } catch(IOException e){ throw new hogeException(); } ------ここまで-------------------------- 内側でスローされた例外は、外側でcatchされるのですか? また、内側でcatchをしなかった場合、外側でcatchされるのですか? この2点を教えていただきたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • try catchは避けるべき?

    C++の質問ですが、 gotoレスは当たり前として(C++に限ったことではないですが)、 try catchもやっぱり避けるべきですか?

  • try catch 文について

    jcpadでプログラムを組んでいます。  コンパイル実行すると 「例外 java.io.IOException は報告されません。スローするにはキャッチまたは、スロー宣言をしなければなりません。」 というエラーがでるのですが、BufferedReaderやDataInputStreamでは 例外処理(try~catch)は必ず書かないといけないんですか?

    • ベストアンサー
    • Java
  • 【C#/Java?】try-catchでcatchせずにfinallyは一般的?

    普段はJavaを使っているのですが、故あってC#のソースを簡易レビューすることになりました。 C#を始めてそれほど間もない人間の書いたソースなのですが、以下のようなソースをたびたびみかけます。 try {   // 処理 } finally {   // finally処理 } C#の場合、Javaとは異なり全ての例外はJavaで言うところの非チェック例外であると認識しています。(ただし、Javaの非チェック例外と同じ扱いをしていいとは思っていませんが……) 呼び出し元に起きうる全ての例外処理を任せるがfinally処理をしたいならば、このような書き方をするのが一般的なのでしょうか。 Javaの場合でもこのような書き方ができることは確認しましたが、Javaの場合は非チェック例外が起きる=バグであることがほとんどなので、このような書き方をする場面はあまりないように思います。 (もちろんチェック例外もthrowsを書けば同じように書くこともできるとは思いますが、自分ならやらないですし、そのようなソースを見たこともないです) ですので、単に自分がJavaを普段使っているからcatchがないことに違和感を感じるだけなのであれば、この問題はスルーしたいと思います。 C#経験者が周りにいない状況ですので、皆様のお知恵をおかりしたいと思います。よろしくお願いします。

  • try catch

    public String getMessage() { try { .... return "okay"; } catch (Exception e) { return "error"; } のように、エラーが起こったら catch 句で String を返すとうプログラムはありですか?

    • ベストアンサー
    • Java
  • try ~ catch構文が使えない

    ロリポップサーバを利用しています。 http://lolipop.jp/?mode=manual&state=hp&state2=cgi try ~ catchやthrowでエラーがでます。 仕方なくcatch文を外したり、throwを使わない構文に していますが、どうも不安です。 try ~ catchやthrowを使えないとあきらめるしか ないのでしょうか? PHPのバージョンが対応していないのでしょうか?

    • ベストアンサー
    • PHP
  • c# の try の入れ子

    try の入れ子はどちらで処理されるのでしょうか? 例 public aaaa() { try(){ bbbb(); } catch(){ } finary(){ } } private bbbb() { try(){ xxxxx ← ここでエラーになる } catch(){ } finary(){ } } この場合、 catch()処理は aaaa() の catch() を行う?それとも bbbb() ? finary() ()処理は aaaa() の finary() を行う?それとも bbbb() ?

  • try~catch

    php初心者です try~catchをわかりやすく教えてください throw new Exceptionが出現したら、catchまでの処理をしないでとばすとゆうことですか? try~catchを抜けたら、他の処理は普通に実行されるのでしょうか? try~catchのカッコ{で囲む範囲は大きくしたほうがいいでしょうか?(大きく囲むと処理スピードおそくなりますか?) try { throw new Exception('エラーが発生しました');  print "hoge"; } catch (Exception $e) {  echo '例外発生', $e->getMessage(), "\n"; }  print "foo"; よろしくお願いします

    • ベストアンサー
    • PHP
  • phpのtry and catchについて

    PHPについて質問ですが try and catchの命令についてPHP5から対応していたはずですが さくらインターネットで0除算の処理を作成し、試してみたのですが 500エラーとなってしまいます。 どなたか、ご存知の方はいらっしゃいませんでしょうか?

    • ベストアンサー
    • PHP
  • TRY CATCHでシステムエラーを検知できない

    TRY CATCHをネストさせた状態で、 テーブルがドロップされていることを検知するにはどうすればよいでしょうか? BEGIN TRY   ★   BEGIN TRY     ▲   END TRY   BEGIN CATCH   END CATCH CATCH END CATCH としているときに、 ★の位置だとテーブルのドロップはCATCH できるのですが ▲の位置だとテーブルのドロップはCATCH できないようですが、 テーブルがドロップされていることを検知するにはどうすればよいでしょうか?

専門家に質問してみよう