Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Использование исключений


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

Код

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


}

Автор: Golovastik 18.12.2010, 22:59
Вот так сработало:
Код

#include <memory>
#include <conio.h>
#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();
    }catch (istream::failure& e){
       cout<<"Вы передали не число!";
  }

 getch();
  return 0;
}


Расшифруйте, вот это место желательно ясно. Что здесь делается?
Код

 auto_ptr<A> obj(new A());


и вот это:
Код

  cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit );

Автор: boostcoder 19.12.2010, 00:50
Цитата(Golovastik @  18.12.2010,  22:59 Найти цитируемый пост)
Что здесь делается?

здесь делается лишнее, ненужное действие smile 

Автор: Golovastik 19.12.2010, 02:03
Хорошо, а как написать правильно?

Автор: borisbn 19.12.2010, 11:37
Цитата(Golovastik @  18.12.2010,  21:20 Найти цитируемый пост)
Как сделать так, чтоб при вводе не числа, выдало исключение?

Ввести строку, попытаться преобразовать её в число ( atoi ), при ошибке выдать исключение.
см. тут: http://forum.vingrad.ru/forum/topic-317180.html
Цитата(Golovastik @  18.12.2010,  22:59 Найти цитируемый пост)
Расшифруйте, вот это место желательно ясно. Что здесь делается?
auto_ptr<A> obj(new A());

http://cplusplus.com/reference/std/memory/auto_ptr/

Цитата(Golovastik @  18.12.2010,  22:59 Найти цитируемый пост)
и вот это:
cin.exceptions ( istream::eofbit | istream::failbit | istream::badbit );

http://cplusplus.com/reference/iostream/ios/exceptions/

Автор: cutwater 19.12.2010, 13:10
Цитата(borisbn @  19.12.2010,  10:37 Найти цитируемый пост)
Ввести строку, попытаться преобразовать её в число ( atoi ), при ошибке выдать исключение.


atoi не надежна и не может гарантировать корректное преобразование ибо

Цитата

If no valid conversion could be performed, a zero value is returned.


Поэтому для гарантированной проверки рекомендуется использовать boost::lexical_cast
(Так же существует в стандартной библиотеке С семейство ф-ций strtol и компания. Они так же обеспечивают возможность корректной обработки ошибок)

Автор: borisbn 19.12.2010, 13:34
Цитата(cutwater @  19.12.2010,  13:10 Найти цитируемый пост)
(Так же существует в стандартной библиотеке С семейство ф-ций strtol и компания. Они так же обеспечивают возможность корректной обработки ошибок)


у них точно также
Цитата
If no valid conversion could be performed, a zero value is returned.


поэтому, я для себя давно написал ф-цию преобразования, которая сначала проверяет, что строка не состоит из всех нулей, а затем вызывает itoa. Вот её псевдокод
Код

result = atoi( str );
if ( result == 0 && allZeros( str ) == false )
    error_handle;


а вообще, согласен. Лучше использовать готовые решения из boost или из Qt

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)