捕捉条款没有抓住权利?

时间:2013-10-24 16:33:38

标签: c++ exception

我正在学习如何在C ++中使用异常,并且在我的“测试”代码中遇到了奇怪的行为。 (请原谅这样一个过于愚蠢的问题,请...这不缺乏研究/努力,只缺乏经验!)如果我只抓住异常DivideByZero它就可以了。

但是引入第二个异常StupidQuestion会使代码无法正常工作。我如何在下面编写它我认为如果需要它应该处理DivideByZero异常,如果不需要则检查StupidQuestion是否发生,如果不是,则返回try子句并打印正常结果。但是,如果我输入a=3b=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。 (所以:intconst char StupidQuestion='F';实际上是唯一从上面改变的东西)而且它运作良好。

当两个异常具有相同类型(catch(char StupidQuestion))时,为什么上述代码不起作用?

2 个答案:

答案 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子句中的变量名称正在创建一个新的局部变量,该变量与具有相同名称的全局常量无关。

另请注意,无法捕捉到一个错误编号...但您可以在我显示时重新抛出未知错误。