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

C++ Which Exception should I use? / Determine user's input

本文关键字:用户 输入 我应该 C++      更新时间:2023-10-16

我是C++的新手,正在测试"try"。然而,我不确定,当投掷可能导致一个单词或短语本身的分裂时,应该抓住什么例外:

例如:

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,但通过"cin<<"设置。如果用户输入一个单词或短语,则程序在将一个单词除以另一个单词时应该会导致错误(hense:sthrow(current_year/current_years);)

但是程序不会捕获带有异常的错误:catch(exception)。请有人解释一下我应该使用什么异常,或者如何修改这个程序来检查current_year是否真的是一个整数。

谢谢。

(还有一件事:isdigit对我不起作用。我相信这是因为它只识别-1到255之间的数字。)。我即将进入2014年。因此,如果我一直在错误地使用isdigit,请让我意识到这一点。)

无论是否输入了有效值,都将抛出类型为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的更多通用处理程序捕获。

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

您有几个可供选择,std::invalid_argument可能在这里最有意义,因为它们输入了无效数据。

不过,您的代码没有实际意义,如果发生意外错误,您应该抛出。您应该根据用户做错的内容创建异常。

您只需抛出数字1(current_year / current_year将始终为1,除非current_year被输入为0,在这种情况下您会遇到更多问题),您将不得不在异常处理程序中捕获一个int,那么捕获1意味着什么?

最好避免catch(...)。有时,当你真的不允许你的函数抛出时,就会使用它,例如,你在某个工作线程中,没有什么能抓住它,它只会导致你的应用程序终止,而最好让线程作为失败的作业终止。