我正在学习如何在C ++中使用异常,并且在我的“测试”代码中遇到了奇怪的行为。 (请原谅这样一个过于愚蠢的问题,请...这不缺乏研究/努力,只缺乏经验!)如果我只抓住异常DivideByZero
它就可以了。
但是引入第二个异常StupidQuestion
会使代码无法正常工作。我如何在下面编写它我认为如果需要它应该处理DivideByZero
异常,如果不需要则检查StupidQuestion
是否发生,如果不是,则返回try
子句并打印正常结果。但是,如果我输入a=3
和b=1
,程序会重定向到DivideByZero
try
子句而不是StupidQuestion
子句。但奇怪的是,divide
确实似乎在抛出StupidQuestion
(参见cout
声明),但它没有正确地抓住,正如{{1}的缺席所见声明。
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
类型的事实有关,所以我更改了代码以使StupidQuestion成为char类型int。 (所以:int
和const char StupidQuestion='F';
实际上是唯一从上面改变的东西)而且它运作良好。
当两个异常具有相同类型(catch(char StupidQuestion)
)时,为什么上述代码不起作用?
答案 0 :(得分:3)
catch(int DivideByZero) { }
catch(int StupidQuestion) { }
两个catch
阻止了int
,它们的名称不同。只能输入第一个,第二个是死代码。
答案 1 :(得分: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
子句中的变量名称正在创建一个新的局部变量,该变量与具有相同名称的全局常量无关。
另请注意,无法捕捉到一个错误编号...但您可以在我显示时重新抛出未知错误。