Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
#1

Использование исключений - C++

18.12.2010, 21:22. Просмотров 676. Ответов 5
Метки нет (Все метки)

Мне нужно сделать так, чтоб если я введу не число, чтоб выдало собственное исключение, чего-то данный код не срабатывает.
Получается в этмо коде, когда я ввожу число, выдаёт результат на экран всё нормально, когда же введу какие-то символы, выбрасывает консоль. Как сделать так, чтоб при вводе не числа, выдало исключение?

Код
#include <iostream>
#include <string>
using namespace std;

class A{
public:
     void f(int z){
     setlocale(LC_ALL,"");
     cout<<"Вы передали число № "<<z; 
     }
};

int main() 
{
  A * obj = new A;
  try{
  setlocale(LC_ALL,"");
  int chislo;
  cout<<"Введите число -> ";
  cin>>chislo;
  obj->f(chislo);
  cin.ignore();
  cin.get();
  delete obj;
  }catch(int z){
       cout<<"Вы передали не число!";
	   cin.get();
  }


}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2010, 21:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование исключений (C++):

Обработка исключений с пмощью структурированной обработки исключений - C++
Есть функция, которая определенным образом работает с файлами,но при работе с файлами &quot;не подходящего&quot; типа вызывается необработанное...

Коды исключений - C++
Какие ещё, кроме std::bad_alloc, есть коды исключений? Содержит ли исключение информацию о месте своего возникновения? А о конкретной...

перехват исключений - C++
Ввести два числа. Меньшее заменить полсумой, а большее - удвоенным произведением. Выражение должно быть вычислено в отдельной...

Обработка исключений - C++
Надо отловить ввод данных некорректного типа. Объясните пожалуйста на конкретном примере, как это правильно сделать. #include...

Обработка исключений - C++
Как сделать обработку исключения так, чтобы, если, например, вводим количество координат больше, чем можно, программа предлагала, или...

Трансляция исключений - C++
Дайте пожалуйста простенький пример, где я ловлю исключение и кидаю его через throw на еще один обработчик catch

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
18.12.2010, 21:54 #2
C++
1
cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit );
C++
1
catch (istream::failure& e)
P.S. Если будет сгенерировано исключение, то ваш delete obj; никогда не вызовется, следовательно будет утечка.
0
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
18.12.2010, 22:05  [ТС] #3
Написал вмест освоей строки исключений, вашу:
C++
1
catch (istream::failure& e)
При вводе текста вместо числа, ничего не выдаёт, а просто закрывается консоль.Проблема не решена, как решить подскажите?
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
18.12.2010, 22:13 #4
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
32
33
#include <memory>
#include <iostream>
#include <string>
using namespace std;
 
class A{
public:
     void f(int z){
     setlocale(LC_ALL,"");
     cout<<"Вы передали число № "<<z;
     }
};
 
int main()
{
  cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit );
  //A * obj = new A;
  auto_ptr<A> obj(new A());
  try{
  setlocale(LC_ALL,"");
  int chislo;
  cout<<"Введите число -> ";
  cin>>chislo;
  obj->f(chislo);
  cin.ignore();
  cin.get();
  //delete obj;
  }catch (istream::failure& e){
       cout<<"Вы передали не число!";
  }
 
  return 0;
}
1
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
18.12.2010, 22:49  [ТС] #5
Исключение не видно. При вводе символов каких-то кавиатуры, а потом нажатии ENTER, консольное окно выключается и всё, исключение не видно,Как решить?
Если перед последней стркоой кода, написать cin.get(); для задержки, программа выдаст исключение от среды разработки студии.

Добавлено через 11 минут
Странно, для задержки экрана только сработала функция getch().

Добавлено через 1 минуту
Объясните пожалуйста вот эту строку, очень подробнее.
C++
1
  auto_ptr<A> obj(new A());

И вот эту потом ещё:

Добавлено через 1 минуту
C++
1
2
  cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit ); //Что это такое внутри?
//Что это за знки разделения '|' куда они воообще попадают?
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
19.12.2010, 17:23 #6
Цитата Сообщение от Golovastik Посмотреть сообщение
Исключение не видно. При вводе символов каких-то кавиатуры, а потом нажатии ENTER, консольное окно выключается и всё, исключение не видно,Как решить?
1) В любой нормальной IDE есть возможность сделать подобную задержу чтобы посмотреть результат.
2) Любое консольное(и не только) приложение можно запустить из комaндной строки(собственно так и запускаются "реальные" консольные приложения).
3) Использовать system("pause")(для Windows естественно), getch()(нестандартная функция) cin.get()(см. ниже) и т.д.
Цитата Сообщение от Golovastik Посмотреть сообщение
Если перед последней стркой кода, написать cin.get(); для задержки, программа выдаст исключение
Ну естественно, если предыдущий ввод завершился с ошибкой...
C++
1
2
3
4
5
6
#include <limits>
//...
cout << "Вы передали не число!";
cin.clear();                                          // сбрасываем флаги состояние потока
cin.ignore(numeric_limits<streamsize>().max(), '\n'); // очищаем входной поток, от мусора
cin.get();                                            // делаем "задержку"...
Цитата Сообщение от Golovastik Посмотреть сообщение
cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit ); //Что это такое внутри?
http://www.cppreference.com/wiki/ru/io/exceptions
Цитата Сообщение от Golovastik Посмотреть сообщение
//Что это за знки разделения '|' куда они воообще попадают?
Если вы не знаете, что такое '|', то думаю с исключениями(и со всем остальным) вам пока рано разбираться.
Цитата Сообщение от Golovastik Посмотреть сообщение
Объясните пожалуйста вот эту строку, очень подробнее.
Умный указатель(smart pointer). Объект, который "притворяется" указателем, которым владеет. Он сам освободит динамическую память(вызовом delete) используя тот указатель, который был ему передан. Таким образом даже если будет сгенерировано исключение, утечки не произойдёт, и писать delete в нескольких местах функции(внутри и вне блока catch) нет необходимости.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2010, 17:23
Привет! Вот еще темы с ответами:

Обработка исключений - C++
Необходимо создать три массива a, b и с размерами соответственно n1, n2 и n3 (n1=!n2=!n3). В массив а занести значения функции...

обратотка исключений - C++
Здравствуйте.Имеется перегруженный оператор() для обращения к эл-ту матрицы float Matrix::operator()(int i,int j) {if(i&gt;j) ...

Обработка исключений - C++
Подскажите пожалуйста как продолжить выполнение программы после срабатывания оператора catch. catch завершает программу, но ее нужно...

Не перехватывается исключений - C++
int a; try{ cin &gt;&gt; a; cout &lt;&lt; a / 0 &lt;&lt; endl; }catch(...){ cout &lt;&lt; &quot;err&quot; &lt;&lt; endl./ }


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.12.2010, 17:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru