Некорректная работа try\catch в цикле

173
16 апреля 2018, 00:16
  1. Добрый день! Излагаю суть дела: есть проверка, согласно которой пользователь не должен ввести символы или ещё какую-то ерунду вместо обычного числа. Использую try\catch внутри цикла, чтобы дать пользователю шанс занести правильные данные. В catch-е для пользователя дополнительно выводится уведомление, мол, Вы ошиблись, данные некорректно ввели. Однако есть проблема. Во время первого прохода цикла в try проверяются введённые данные, я заведомо их вношу неправильно, чтобы получить второй шанс на ввод. Однако шанса этого нет. Уведомление, расположенное для пользователя в catch-е, зацикливается в консоли. Путём экспериментов было установлено, что try просто не хочет работать последующие разы. Что делать? Помогите, пожалуйста, перепробовала уже всё.

  2. Код:

    #include"Struct.cpp"
    #include"Functions.cpp"
    using namespace std;
    int main()
    {
      int counter, user_cost;//кол-во произведений; цена пользователя
      bool flag;
      cout << "How many pieces of art you wanna describe?" << endl;
      do
    {
         flag = true;
         try
       {
         cin >> counter;//ввод кол-ва описываемых произведений
         Art *PiecesOfArt = new Art[counter];//массив структур
         Input(PiecesOfArt, counter);//заполнение массива 
         Files(PiecesOfArt, counter);//запись данных в файл
         Output(PiecesOfArt, counter);//вывод структуры
         cout << endl << "Input your cost, please: ";//ввод пользовательской цены
         cin >> user_cost;
         Search(PiecesOfArt, counter, user_cost);//поиск и вывод удовлетворяющих лотов
         delete[]PiecesOfArt;//удаление динам. массива структур
       }
          catch (...)
         {
            flag = false;
            cout << "Incorrect input! Try again, please! "<< endl;
         }
    } while (!flag);
       system("pause");
       return 0;
     }
    
Answer 1

Решение ловить исключение в конструкции do / while логически неправильное. Пишите например так:

bool flag = true;
while (flag)
{
    try
    {
      // ваши функции
    }
    catch (...)
    {
        flag = false;
        cout << "Incorrect input! Try again, please! "<< endl;
    }
}
Answer 2

В блоке do while сначала выполняется тело цикла а потом проверяется условие . Соответственно когда в блоке catch вы выставляете flag = false условие (!flag) выдает true и вас возвращает в начало цикла . Можно избавиться от данного эффекта перенеся

  flag = true;

в конец блока try :

     try
   {
     cin >> counter;//ввод кол-ва описываемых произведений
     Art *PiecesOfArt = new Art[counter];//массив структур
     Input(PiecesOfArt, counter);//заполнение массива 
     Files(PiecesOfArt, counter);//запись данных в файл
     Output(PiecesOfArt, counter);//вывод структуры
     cout << endl << "Input your cost, please: ";//ввод пользовательской цены
     cin >> user_cost;
     Search(PiecesOfArt, counter, user_cost);//поиск и вывод удовлетворяющих лотов
     delete[]PiecesOfArt;//удаление динам. массива структур
     flag = true
   }

но тогда вы выполните блок try 2 раза ( Если вы как-то подкорректируете данные для того чтобы исключения не возникало ). Добавив break в конец блока try получите рабочее решение :

try
{
 cin >> counter;//ввод кол-ва описываемых произведений
 Art *PiecesOfArt = new Art[counter];//массив структур
 Input(PiecesOfArt, counter);//заполнение массива 
 Files(PiecesOfArt, counter);//запись данных в файл
 Output(PiecesOfArt, counter);//вывод структуры
 cout << endl << "Input your cost, please: ";//ввод пользовательской цены
 cin >> user_cost;
 Search(PiecesOfArt, counter, user_cost);//поиск и вывод удовлетворяющих 
 //..лотов
 delete[]PiecesOfArt;//удаление динам. массива структур
 flag = true;
 break;
}
READ ALSO
Зачем нужны динамические массивы в C++?

Зачем нужны динамические массивы в C++?

В учебниках по C++ пишут, что динамические массивы нужны, когда заранее неизвестны размеры этих массивовПотом идет объяснение, как выделять...

213
Взаимодейстие с клавиатурой на C/C++

Взаимодейстие с клавиатурой на C/C++

1-2 дня назад я задал вопрос, но не совсем корректный, поэтому сейчас я постараюсь поставить его более правильноДопустим, есть игра, в которой...

157
ГПСЧ с помощью Mersenne twister (диапазон значений)

ГПСЧ с помощью Mersenne twister (диапазон значений)

Добрый день, друзьяПодскажите, пожалуйста, алгоритм применения вихря Мерсенна в заданном диапазоне значений (н-р 1-100), можно и реализацию...

206