0

C++ で例外を使用する方法を学習していて、「テスト」コードで奇妙な動作に遭遇しました。(このような非常に愚かな質問を許してください...それは研究/努力の欠如ではなく、単なる経験の欠如です!)例外だけをキャッチしている場合、問題なくDivideByZero動作します。

しかし、2 番目の例外を導入StupidQuestionすると、コードが期待どおりに機能しなくなります。以下にどのように書いたDivideByZeroか、必要に応じて例外を処理し、そうでない場合は発生するかどうかを確認し、そうでない場合は節StupidQuestionに戻って通常の結果を出力する必要があると考えました。tryしかし、たとえば and を入力するとa=3、プログラムは節ではなく節にb=1リダイレクトされます。ただし、奇妙なことに、投げているように見えますが(viaステートメントを参照)、ステートメントがないことからもわかるように、正しくキャッチされていません。DivideByZero tryStupidQuestiondivideStupidQuestioncoutcout

#include <iostream>
#include <cstdlib>
using namespace std;
const int DivideByZero = 42;
const int StupidQuestion=1337;
float divide (int,int);
main(){
       int a,b;
       float c;
       cout << "Enter numerator: ";
       cin >> a;
       cout << "Enter denominator: ";
       cin >> b;
       try{
           c = divide(a,b);
           cout << "The answer is " << c << endl;
           }
       catch(int DivideByZero){
                           cout << "ERROR: Divide by zero!" << endl;
                           }
       catch(int StupidQuestion){
                                 cout << "But doesn't come over here...?" << endl;
                             cout << "ERROR: You are an idiot for asking a stupid question like that!" << endl;
                             }
       system("PAUSE");
       }

float divide(int a, int b){
      if(b==0){
               throw DivideByZero;
               }
      else if(b==1){
               cout << "It goes correctly here...?" << endl;
               throw StupidQuestion;
               }
      else return (float)a/b;
}

DivideByZeroStupidQuestionが両方とも 型であることに関係があるのではないかと考えたintので、StupidQuestion を int ではなく char 型にするようにコードを変更しました。(つまりconst char StupidQuestion='F';catch(char StupidQuestion)実際には上記から変更されたのはそれだけでした)そして、それはうまくいきました。

int2 つの例外が同じタイプ ( )の場合、上記のコードが機能しないのはなぜですか?

4

3 に答える 3

3

これの代わりに

catch(int DivideByZero) {
    cout << "ERROR: Divide by zero!" << endl;
}
catch(int StupidQuestion) {
    cout << "But doesn't come over here...?" << endl;
    cout << "ERROR: You are an idiot for asking a stupid question like that!" << endl;
}

あなたは探している

catch (int errval) {
    if (errval == DivideByZero) {
        cout << "ERROR: Divide by zero!" << endl;
    }
    else if (errval == StupidQuestion) {
        cout << "ERROR: You are an idiot for asking a stupid question like that!" << endl;
    }
    else {
        throw; // for other errors, keep searching for a handler
    }
}

句内の変数名catchは、同じ名前のグローバル定数とは関係のない新しいローカル変数を作成しています。

また、エラー番号を 1 つだけキャッチする方法はないことに注意してください。

于 2013-10-24T16:40:40.143 に答える