除非指定 cin.exceptions() 否则不会捕获异常的情况:
...
cin.exceptions(istream::failbit | istream::badbit);
cout << "Вводите резльтаты игры в гольф (введите не число, если хотите закончить):\n";
int num;
bool finish = false;
for (int i = 0; i < 10; i++) {
cout << "Введите результат № " << i + 1 << ": ";
try {
cin >> num;
}
catch (istream::failure e) { //БЕЗ cin.exceptions() НЕ СРАБОТАЕТ
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Ввод прекращен.\n";
break;
}
arr.push_back(num);
}
...
但是在另一个程序中,没有 cin.exceptions() 一切都会正常工作:(
来自 cplusplus.com 的示例:[ http://www.cplusplus.com/reference/exception/exception/?kw=exception ])
// exception example
#include <iostream> // std::cerr
#include <typeinfo> // operator typeid
#include <exception> // std::exception
class Polymorphic {virtual void member(){}};
int main () {
try
{
Polymorphic * pb = 0;
typeid(*pb); // throws a bad_typeid exception
}
catch (std::exception& e)
{
std::cerr << "exception caught: " << e.what() << '\n';
}
return 0;
}
为什么在某些情况下需要将参数传递给 cin.exceptions() 函数,而在其他情况下则不需要?你怎么知道什么时候需要,什么时候不需要?
在第一种情况下,该函数抛出一个 std::istream::failure 异常(该异常仅针对流抛出),以便处理与输入流相关的异常(如果输入格式不匹配或流由于某种原因坏了)。
第二种,
typeid如果没有类型信息,本身可以抛出一个bad_typeid异常,调用函数必须处理这个异常。在这里输入流是完全无关的。这个“其他”案例在哪里?在第二个示例中,
std::cin根本没有使用该对象。关于第一个例子:
在这里为标准输入流设置异常掩码。如果从流中读取时发生错误,默认情况下不会抛出异常。但是,如果掩码已设置(当然不是“空”),则会抛出异常。