Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 18
1

Обработка исключения в цикле while

15.08.2017, 20:21. Показов 4783. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В цикле может возникнуть исключение, которое нужно в цикле же обработать и перейти на следующую итерацию этого же цикла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int error = 0;
int num = 0;
for (string day; cin >> day;) {
  if (day == "|") break;
  try {
  cin >> num;
  if (!cin) throw exception("Enter the number\n");
  }
  catch (exception) {
  cerr << "Input error\n";
  error += 1;
  }
///
}
На выходе error выдаёт значение 1, исключение сработало, но происходит выход из цикла.
Если не вызывать исключение, то цикл прекрасно работает
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2017, 20:21
Ответы с готовыми решениями:

Обработка исключения
Доброго времени суток, ув. программисты С++. Суть моей проблемы в том, что мне надо сделать некую...

Обработка сиситемного исключения
Друзья как мне переделать код, чтобы была обработка сиситемного исключения? Нужно ещё кроме деления...

Выход за пределы массива, обработка исключения
Есть такой код, когда я вызываю функцию на вывод массив еще не инициализирован, и я хочу чтобы у...

Обработка исключения на русские буквы (try/catch)
Доброго времени суток. Хотелось бы узнать как обработать исключение на русские буквы через...

4
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
15.08.2017, 20:56 2
Цитата Сообщение от sgtimur Посмотреть сообщение
но происходит выход из цикла.
Потому что cin в ошибочном состоянии остается,
так что cin >> day в результате даст false.
1
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
15.08.2017, 21:14 3
Лучший ответ Сообщение было отмечено sgtimur как решение

Решение

Croessmah,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <string>
#include <iostream>
#include <exception>
 
int main(int argc, char* argv[] )
{
    int error = 0;
    int num = 0;
    
    for (std::string day; std::cin >> day;)
    {
        if (day == "|") break;
        try
        {
            std::cin >> num;
            if (!std::cin) throw std::exception("Enter the number\n");
        }
        catch (std::exception)
        {
            std::cin.clear();
            std::cerr << "Input error\n";
            error += 1;
        }
    }
 
    return 0;
}
а так тоже остается в ошибочном состоянии?

Добавлено через 11 минут
Croessmah,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <string>
#include <iostream>
#include <exception>
 
int main(int argc, char* argv[] )
{
    int error = 0;
    int num = 0;
    
    for (std::string day; std::cin >> day;)
    {
        if (day == "|") break;
        try
        {
            std::cin >> num;
            if (!std::cin)
            {
                std::cin.clear();
                throw std::exception("Enter the number\n");
            }
        }
        catch (std::exception)
        {
            std::cerr << "Input error\n";
            error += 1;
        }
    }
 
    return 0;
}
так тоже не работает в VS
1
0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 18
16.08.2017, 08:31  [ТС] 4
Цитата Сообщение от Croessmah Посмотреть сообщение
Потому что cin в ошибочном состоянии остается,
так что cin >> day в результате даст false.
_stanislav,

Предотвратило выход из цикла добавление в catch строки
C++
1
cin.clear()
Но теперь после срабатывания исключения следующий ввод тоже почему-то проходит через
C++
1
throw
, даже если ввод правильный

Добавлено через 21 минуту
Еще добавил
C++
1
cin.ignore(10, '\n');
Теперь все работает отлично. Спасибо
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
16.08.2017, 10:44 5
Лучший ответ Сообщение было отмечено sgtimur как решение

Решение

Попробуйте так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <string>
#include <iostream>
#include <exception>
 
int main(int argc, char* argv[])
{
    int error = 0;
    int num = 0;
 
    for (std::string day; std::cin >> day;)
    {
        if (day == "|") break;
        try
        {
            std::cin >> num;
            if (!std::cin)
            {
                std::cin.clear();
                std::cin.ignore();
                throw std::exception("Enter the number\n");
            }
        }
        catch (const std::exception&)
        {
            std::cerr << "Input error\n";
            error += 1;
        }
    }
 
    return 0;
}
std::cin.ignore() нужен, так как в буфере остался предыдущий ввод, который сразу сбрасывается в day.
1
16.08.2017, 10:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2017, 10:44
Помогаю со студенческими работами здесь

Проверка входных данных: вызов и обработка исключения
Всем привет. Не могу разобраться с проверкой входных данных. Нужно чтобы если я ввел какой либо...

Конвертация wchar_t в число целого типа. Обработка исключения
Конвертирую считываемые данные с Экселя в число типа int,для дальнейшей проверки вхождения в...

Задать функцию которая возвращает частное деление двух чисел (обработка ошибок - через исключения)
Ребят,срочно нужнатваша помощ.Задать функцию,которая возвращает частное деление двух...

Обработка векторов в неразветвленном цикле
Помогите пожалуйста решить задачку... Задание. Составить и испытать циклическую программу для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru