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

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

Войти
Регистрация
Восстановить пароль
 
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
#1

Исключительные ситуации - C++

22.04.2013, 11:14. Просмотров 396. Ответов 9
Метки нет (Все метки)

Доброго времени суток. Возникла такая проблема. Никак не могу разобраться с исключительными ситуациями. Вот допустим, как здесь сделать, что бы при вводе некорректной даты вызывался обработчик исключительной ситуации? Вот то что я набросал, естественно это не работает.
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
using namespace std;
class Date {    
    private:    
        int day;
        int month;
        int year;
    public:
        Date():day(0),month(0),year(0) {};
        Date(int d, int m, int y):day(d),month(m),year(y) {};
        ~Date(){};
    private:
        friend ostream& operator << (ostream& out, const Date& obj){
            cout<<obj.day<<"."<<obj.month<<"."<<obj.year<<"\n";
            return out;
        };
        friend istream& operator >> (istream& in, Date& obj){
            cout<<"Enter date: \n";
            try{
            cin>>obj.day;
            throw obj.day;
            }
            catch (double i){
                cout << "Вы ввели дробное число" << "\n";
            };
            try{
            cin>>obj.month;
            throw obj.month;
            }
            catch (double i){
                cout << "Вы ввели дробное число" << "\n";
            };
            try{
            cin>>obj.year;
            throw obj.year;
            }
            catch (double i){
                cout << "Вы ввели дробное число" << "\n";
            };
            return in;
        };  
};
 
int main(){
    Date obj[3]={};
    for(int i=0; i<3; i++){
        cin>>obj[i];
    };
    for(int i=0; i<3; i++){
        cout<<obj[i];
    };
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2013, 11:14     Исключительные ситуации
Посмотрите здесь:

Исключительные ситуации - C++
Функция должна выполнять проверку параметров, передаваемых и генерировать исключения в случае ошибки. Без спецификаторов исключений; ...

исключительные ситуации - C++
почему не работает?? как надо?? #include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; template&lt;class T&gt; class Vector...

Исключительные ситуации - C++
Надо сделать так, чтоб при вводе чарового символа в итовый вектор выводило сообщение об ошибке, но программа не закрывалась, а просто...

исключительные ситуации - C++
Подскажите, как сделать переполнение в этой задаче: Создать класс для хранения обыкновенных дробей. Запрограммировать метод сокращения...

исключительные ситуации - C++
Описать и реализовать функцию анализа номера телефона, обработайте ошибку создания номера в неверном формате (допустимый формат - +8 (095)...

Исключительные ситуации - C++
Почему программа не работает?? Исключительная ситуация возникающая при деление на нуль. Пользователь с клавиатуры должен ввести число, если...

Исключительные ситуации - C++
Как обработать исключительную ситуацию,когда переменная описана как int,к примеру,а вводится какой-нибудь char?А то нам как то в лекции...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 11:20     Исключительные ситуации #2
art3330, суть исключений (exception) в том, что срабатывают и обрабатываются они в совершенно разных архитектурных уровнях программы. Если Вы выявили ошибку, и сразу же знаете как ее обработать - использовать исключения нет особого смысла, т.к. можно обойтись обычным условием (if). В Вашем примере с датами исключения должны бросаться (throw) в классе Date, а перехватываться (catch) в пользовательском коде где-то в main().
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
22.04.2013, 11:58  [ТС]     Исключительные ситуации #3
То есть мы должны делать как-то так ?
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
34
35
36
37
38
39
40
41
#include <iostream>
using namespace std;
class Date {    
    private:    
        int day;
        int month;
        int year;
    public:
        Date():day(0),month(0),year(0) {};
        Date(int d, int m, int y):day(d),month(m),year(y) {};
        ~Date(){};
    private:
        friend ostream& operator << (ostream& out, const Date& obj){
            cout<<obj.day<<"."<<obj.month<<"."<<obj.year<<"\n";
            return out;
        };
        friend istream& operator >> (istream& in, Date& obj){
            cout<<"Enter date: \n";
            cin>>obj.day;
            throw obj.day;
            cin>>obj.month;
            throw obj.month;
            cin>>obj.year;
            throw obj.year;
            return in;
        };  
};
 
int main(){
    Date obj[3]={};
    for(int i=0; i<3; i++){
        cin>>obj[i];
        catch (double i){
                cout << "Вы ввели дробное число" << "\n";
        };
    };
    for(int i=0; i<3; i++){
        cout<<obj[i];
    };
    return 0;
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 12:04     Исключительные ситуации #4
art3330, обработку Вы вынесли, это хорошо. Теперь надо реализовать свой класс исключения (не стоит использовать встроенные типы int,double и прочее), и вызывать
C++
1
throw объект_класса_исключения;
только в нужные моменты, т.е. когда есть ошибка. Например:
C++
1
2
3
4
5
6
cin>>obj.day;
if( obj.day > 31 || obj.day < 1 || cin.fail() )
{ 
   throw объект_класса_исключения;
}
...
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
22.04.2013, 12:16  [ТС]     Исключительные ситуации #5
Я немного не понимаю, что за класс нам нужен. Вот сделал через инт, разве так не должен работать ?
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
class Date {    
    private:    
        int day;
        int month;
        int year;
    public:
        Date():day(0),month(0),year(0) {};
        Date(int d, int m, int y):day(d),month(m),year(y) {};
        ~Date(){};
    private:
        friend ostream& operator << (ostream& out, const Date& obj){
            cout<<obj.day<<"."<<obj.month<<"."<<obj.year<<"\n";
            return out;
        };
        friend istream& operator >> (istream& in, Date& obj){
            cout<<"Enter date: \n";
            cin>>obj.day;
            cin>>obj.day;
            if( obj.day > 31 || obj.day < 1 || cin.fail()){ 
                throw 1;
            };
            cin>>obj.month;
            if( obj.month>12 || obj.month<1 || cin.fail()){ 
                throw 2;
            };
            cin>>obj.year;
            if( obj.year > 2013 || obj.year <1970 || cin.fail()){ 
                throw 3;
            };
            return in;
        };  
};
 
int main(){
    Date obj[3]={};
    for(int i=0; i<3; i++){
        cin>>obj[i];
        catch (int i){
                cout << "Ошибка " <<<i< "\n";
        };
    };
    for(int i=0; i<3; i++){
        cout<<obj[i];
    };
    return 0;
}
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
22.04.2013, 12:18     Исключительные ситуации #6
art3330, НЕ кидайтесь интами/чарами/стрингами/чем бы то ни было, что не является объектом класса исключения. Просто запомните это. Напишите свой класс производный от std::invalid_argument к примеру и кидайтесь им.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 12:22     Исключительные ситуации #7
art3330, после создания своего класса исключений подправьте main() там не хватает блока
C++
1
try {}
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
22.04.2013, 12:23     Исключительные ситуации #8
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <stdexcept>
#include <limits>
 
using namespace std;
 
class InvalidDate : public std::invalid_argument
{
public:
   InvalidDate(const char* const what) : std::invalid_argument(what) {}
};
 
class Date {    
    private:    
        int day;
        int month;
        int year;
    public:
        Date():day(0),month(0),year(0) {};
        Date(int d, int m, int y):day(d),month(m),year(y) {};
        ~Date(){};
    private:
        friend ostream& operator << (ostream& out, const Date& obj){
            cout<<obj.day<<"."<<obj.month<<"."<<obj.year<<"\n";
            return out;
        };
        friend istream& operator >> (istream& in, Date& obj){
            cout<<"Enter date: \n";
            cin>>obj.day;
            if( obj.day > 31 || obj.day < 1 || cin.fail()){ 
                throw InvalidDate("invalid day");
            };
            cin>>obj.month;
            if( obj.month>12 || obj.month<1 || cin.fail()){ 
                throw InvalidDate("invalid month");
            };
            cin>>obj.year;
            if( obj.year > 2013 || obj.year <1970 || cin.fail()){ 
                throw InvalidDate("invalid year");
            };
            return in;
        };  
};
 
int main(){
    Date obj[3]={};
    for(int i=0; i<3;){
        try
        {
           cin>>obj[i];
           ++i;
        }
        catch (const InvalidDate& e){
                cout << "Ошибка " << e.what() << "\n";
                cout << "Попробуйте еще раз" << "\n";
                std::cin.clear();
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    };
    for(int i=0; i<3; i++){
        cout<<obj[i];
    };
    return 0;
}
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
23.04.2013, 12:13  [ТС]     Исключительные ситуации #9
Теперь с примером наконец разобрался. Спасибо.

Добавлено через 23 часа 23 минуты
Возникла такая проблема. Работаю с тремя полями. Первое типа string. Два других типа int. Со string все отрабатывает хорошо, при некорректном вводе ловит исключение. А вот с int'ом есть один косяк. Если я ввожу, число из недопустимого диапазона, то исключения ловятся отлично. Если я ввожу строку начинающуюся с буква, то исключения ловится отлично. А вот если я ввожу строку начинающуюся с цифры, например "1фцвфы", то эта единица присваивается в первый int, и у меня вылазит сообщение, что было поймано исключение во втором int'е. Может кто знает, как решить эту проблема?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2013, 12:21     Исключительные ситуации
Еще ссылки по теме:

Исключительные ситуации в классах - C++
Добрый день. Нужна помощь, есть класс дробей. В нём я сделал исключительные ситуации для переполенения и для деления на 0. Но надо чтобы...

Препроцессор,исключительные ситуации - C++
Всем доброго времени суток!) По прочтению изложенного в моей книге материала по искл. ситуациям и операторам препроцессора(? так можно...

обработать исключительные ситуации - C++
Функция вычисляет корень квадратного уравнения ax2+bx+c=0 Нужно обработать исключительные ситуации

объясните программу исключительные ситуации С++ - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; int main() { std::fstream fs ; fs.exceptions(std::ios::badbit |...

Не получается использовать исключительные ситуации - C++
Здравствуйте, столкнулся с проблемкой, необходимо использовать исключительные ситуации в С++, если я вызываю ее с помощью throw то все...


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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.04.2013, 12:21     Исключительные ситуации #10
art3330, можно читать построчно, т.е. через getline(), потом уже парсить строку.
Yandex
Объявления
23.04.2013, 12:21     Исключительные ситуации
Ответ Создать тему
Опции темы

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