我是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,那么请让我意识到这一点。)
答案 0 :(得分:4)
无论是否输入了有效值,您都会抛出int
类型的值。如果current_year
为零,您可能会遇到某种错误 - 未定义的行为,可能不是可捕获的异常;否则,您将始终抛出int
值1.这可以由catch(int)
块处理;但这没有任何意义。
如果你想在用户输入数字以外的东西时抛出,那么你需要检查输入的结果:
if (!(cin >> current_year)) {
throw std::runtime_error("Invalid year");
}
runtime_error
是exception
的子类,因此会被exception
的处理程序捕获。
或者,您可以定义自己的异常类并抛出它。最好如果它也是exception
的子类,那么如果没有更具体的处理程序,那么它的处理程序至少可以为它提取错误消息。这可能看起来像
struct InvalidYear : std::runtime_error {
InvalidYear() : std::runtime_error("Invalid year") {}
};
if (!(cin >> current_year)) {
throw InvalidYear();
}
这可以由InvalidYear
的特定处理程序或runtime_error
和exception
的更多通用处理程序捕获。
答案 1 :(得分:2)
您按类型抛出异常。尽管该语言允许任何类型,但您通常只应抛出从std::exception
派生的内容。
您可以选择多个,std::invalid_argument
可能在这里输入无效数据时最有意义。
但是,您的代码没有任何意义,如果发生意外错误,您应该抛出。您应该根据用户错误的文本创建例外。
您只需抛出数字1(current_year / current_year
将始终为1,除非current_year输入为0,在这种情况下您有更多问题)并且您必须在异常处理程序中捕获一个int,以及无论如何会抓到1个意思吗?
理想情况下要避免catch(...)
。当你真的不允许你的函数抛出时,有时会使用它,例如你在一些工作线程中没有任何东西可以捕获它,它只会导致你的应用程序终止,因为最好让线程作为失败的工作而死。