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

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

Восстановить пароль Регистрация
 
Golovastik
 Аватар для Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
18.12.2010, 21:22     Использование исключений #1
Мне нужно сделать так, чтоб если я введу не число, чтоб выдало собственное исключение, чего-то данный код не срабатывает.
Получается в этмо коде, когда я ввожу число, выдаёт результат на экран всё нормально, когда же введу какие-то символы, выбрасывает консоль. Как сделать так, чтоб при вводе не числа, выдало исключение?

Код
#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();
  }


}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2010, 21:22     Использование исключений
Посмотрите здесь:

Обработка исключений C++
C++ обработка исключений
Обработка исключений с пмощью структурированной обработки исключений C++
Обработка исключений C++
C++ обработка исключений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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; никогда не вызовется, следовательно будет утечка.
Golovastik
 Аватар для Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
18.12.2010, 22:05  [ТС]     Использование исключений #3
Написал вмест освоей строки исключений, вашу:
C++
1
catch (istream::failure& e)
При вводе текста вместо числа, ничего не выдаёт, а просто закрывается консоль.Проблема не решена, как решить подскажите?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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;
}
Golovastik
 Аватар для 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 ); //Что это такое внутри?
//Что это за знки разделения '|' куда они воообще попадают?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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) нет необходимости.
Yandex
Объявления
19.12.2010, 17:23     Использование исключений
Ответ Создать тему
Опции темы

Текущее время: 22:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru