проблема с исключением ввода-вывода в c ++ (оператор "cin") - PullRequest
1 голос
/ 08 июля 2011

В следующей программе:

int main(){

    std::cout<<"enter numbers to be divide"<<std::endl;
    int a,b,c;

    while(true){
        try{
            if(!(std::cin>>a>>b)){
                throw std::invalid_argument("please enter proper interger");
            }

            if(b==0){
                throw std::runtime_error("please enter enter nonzero divisor");
            }
            c=a/b;
            std::cout<<"quotient = "<<c<<std::endl;
        }
        catch(std::invalid_argument e){
            std::cout<<e.what()<<"\ntry again?enter y/n";
            char c;
            std::cin>>c;
            if(c=='n'||c=='N') break;
        }
        catch(std::runtime_error e){
            std::cout<<e.what()<<"\ntry again?enter y/n";
            char c;
            std::cin>>c;
            if(c=='n'||c=='N') break;
        }
    }
    return 0;
}

Я использую два вида исключений. Программа отлично работает, когда выдает исключение «runtime_error», но входит в бесконечный цикл при обнаружении исключения «invalid_argument».На самом деле есть проблема в операторе "cin>>c" в catch-блоке, но не могу понять, почему это происходит.

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Когда std::cin>>a>>b встречается с нечисловым символом, происходят две важные вещи:

  • сбойный символ не используется ;
  • бит сбояstd::cin установлено.

Последнее препятствует успешному завершению всех дальнейших чтений из std::cin.Это включает в себя те, которые находятся внутри вашего блока invalid_argument catch, и те, которые находятся внутри последующих итераций цикла.

Чтобы исправить это, вам нужно очистить состояние std::cin и использовать символ, вызывающий сбой.Это очень хорошо объяснено в следующем ответе, указанном KennyTM: C ++ символ в int .

0 голосов
/ 08 июля 2011

Вы можете играть с масками исключений , вы можете найти предпочтительный способ обработки ошибок.

...