C ++我应该使用哪种例外? /确定用户的输入

时间:2014-09-15 13:55:47

标签: c++ exception

我是C ++的新手,正在测试'尝试'。 但我不确定应该捕获什么异常,当抛出可能导致单词或短语本身分裂时:

例如:

int current_year = 1;

//code....

cout << "What year is it?\n";
cin >> current_year;

while (n>1) {

    try{
        throw (current_year / current_year);
    }
    catch (exception) {
        cout << "What year is it?\n";
        cin >> current_year;
    }
    catch (...){
        n = 0;

这里,由于current_year被定义为int,但是通过&#34; cin&lt;&lt;&#;如果用户输入单词或短语,程序在将单词除以另一个单词时会导致错误(hense:throw(current_year / current_year);)

但程序没有捕获异常错误:catch(exception)。 请有人解释一下我应该使用什么异常,或者如何重新编写这个程序以检查current_year是否实际上是一个整数。

感谢。

(另一件事:isdigit并不适合我。我相信这是因为它只能识别-1到255之间的数字。我正在进入2014年。所以如果我一直在使用isdigit,那么请让我意识到这一点。)

2 个答案:

答案 0 :(得分:4)

无论是否输入了有效值,您都会抛出int类型的值。如果current_year为零,您可能会遇到某种错误 - 未定义的行为,可能不是可捕获的异常;否则,您将始终抛出int值1.这可以由catch(int)块处理;但这没有任何意义。

如果你想在用户输入数字以外的东西时抛出,那么你需要检查输入的结果:

if (!(cin >> current_year)) {
    throw std::runtime_error("Invalid year");
}

runtime_errorexception的子类,因此会被exception的处理程序捕获。

或者,您可以定义自己的异常类并抛出它。最好如果它也是exception的子类,那么如果没有更具体的处理程序,那么它的处理程序至少可以为它提取错误消息。这可能看起来像

struct InvalidYear : std::runtime_error {
    InvalidYear() : std::runtime_error("Invalid year") {}
};

if (!(cin >> current_year)) {
    throw InvalidYear();
}

这可以由InvalidYear的特定处理程序或runtime_errorexception的更多通用处理程序捕获。

答案 1 :(得分:2)

您按类型抛出异常。尽管该语言允许任何类型,但您通常只应抛出从std::exception派生的内容。

您可以选择多个,std::invalid_argument可能在这里输入无效数据时最有意义。

但是,您的代码没有任何意义,如果发生意外错误,您应该抛出。您应该根据用户错误的文本创建例外。

您只需抛出数字1(current_year / current_year将始终为1,除非current_year输入为0,在这种情况下您有更多问题)并且您必须在异常处理程序中捕获一个int,以及无论如何会抓到1个意思吗?

理想情况下要避免catch(...)。当你真的不允许你的函数抛出时,有时会使用它,例如你在一些工作线程中没有任何东西可以捕获它,它只会导致你的应用程序终止,因为最好让线程作为失败的工作而死。