Привет. Очередной у меня глупый вопрос возник.. допустим пользователь в инт переменную в помощью cin ввел букву.. программа завершится с ошибкой.. как перехватить исключение?
Здравствуйте, r1der, Вы писали:
R>Привет. Очередной у меня глупый вопрос возник.. допустим пользователь в инт переменную в помощью cin ввел букву.. программа завершится с ошибкой.. как перехватить исключение?
Не сделать исключение, а отловить.
Сделать — это либо кинуть исключение, либо создать свой класс-исключение.
Пример обработки ошибок:
int digit = -1;
try
{
cout << "Please input a letter" << endl;
cin >> digit;
if(cin.fail())
cout << "It wasn't a digit!" << endl;
if(!cin)
cout << "It wasn't a digit!" << endl;
}
catch(...)
{
cout << "unknown exception" << endl;
}
Здравствуйте, r1der, Вы писали:
R>Привет. Очередной у меня глупый вопрос возник.. допустим пользователь в инт переменную в помощью cin ввел букву.. программа завершится с ошибкой.. как перехватить исключение?
1. Программа ошибкой не завершится. Будет установлен флаг failbit потока, а переменная не будет модифицирована. Так по умолчанию. Проверить флаг можно методом fail().
int num;
cin>>num;
if(cin.fail())
{
cout<<"Error"<<endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}
2. Для того, чтоб поток генерировал исключения необходимо установить флаги при которых будут эти исключения генерироваться.
int num;
cin.exceptions(ios::failbit);
try
{
cin>>num;
}
catch(runtime_error& e)
{
cout<<e.what()<<endl;
}
Здравствуйте, Micren, Вы писали:
M>Здравствуйте, r1der, Вы писали:
R>>Привет. Очередной у меня глупый вопрос возник.. допустим пользователь в инт переменную в помощью cin ввел букву.. программа завершится с ошибкой.. как перехватить исключение?
M>1. Программа ошибкой не завершится. Будет установлен флаг failbit потока, а переменная не будет модифицирована. Так по умолчанию. Проверить флаг можно методом fail().
M>M> int num;
cin>>>num;
M> if(cin.fail())
M> {
M> cout<<"Error"<<endl;
M> cin.clear();
M> cin.ignore(numeric_limits<streamsize>::max(),'\n');
M> }
M>
M>2. Для того, чтоб поток генерировал исключения необходимо установить флаги при которых будут эти исключения генерироваться.
M>M> int num;
M> cin.exceptions(ios::failbit);
M> try
M> {
cin>>>num;
M> }
M> catch(runtime_error& e)
M> {
M> cout<<e.what()<<endl;
M> }
M>
а модно поподробнее про cin.exceptions(ios::failbit); и runtime_error& e .я знаю как раотаю исключения.. но мне непоятно.. почему исключение runtime_error&
и кстати что означает вот ээто? numeric_limits<streamsize>::max() где про это можно почитать?