C++ で例外を使用する方法を学習していて、「テスト」コードで奇妙な動作に遭遇しました。(このような非常に愚かな質問を許してください...それは研究/努力の欠如ではなく、単なる経験の欠如です!)例外だけをキャッチしている場合、問題なくDivideByZero
動作します。
しかし、2 番目の例外を導入StupidQuestion
すると、コードが期待どおりに機能しなくなります。以下にどのように書いたDivideByZero
か、必要に応じて例外を処理し、そうでない場合は発生するかどうかを確認し、そうでない場合は節StupidQuestion
に戻って通常の結果を出力する必要があると考えました。try
しかし、たとえば and を入力するとa=3
、プログラムは節ではなく節にb=1
リダイレクトされます。ただし、奇妙なことに、投げているように見えますが(viaステートメントを参照)、ステートメントがないことからもわかるように、正しくキャッチされていません。DivideByZero
try
StupidQuestion
divide
StupidQuestion
cout
cout
#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;
}
DivideByZero
とStupidQuestion
が両方とも 型であることに関係があるのではないかと考えたint
ので、StupidQuestion を int ではなく char 型にするようにコードを変更しました。(つまりconst char StupidQuestion='F';
、catch(char StupidQuestion)
実際には上記から変更されたのはそれだけでした)そして、それはうまくいきました。
int
2 つの例外が同じタイプ ( )の場合、上記のコードが機能しないのはなぜですか?