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

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

Восстановить пароль Регистрация
 
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
22.04.2013, 11:14     Исключительные ситуации #1
Доброго времени суток. Возникла такая проблема. Никак не могу разобраться с исключительными ситуациями. Вот допустим, как здесь сделать, что бы при вводе некорректной даты вызывался обработчик исключительной ситуации? Вот то что я набросал, естественно это не работает.
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++
Исключительные ситуации в классах C++
C++ исключительные ситуации
Исключительные ситуации C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.04.2013, 11:20     Исключительные ситуации #2
art3330, суть исключений (exception) в том, что срабатывают и обрабатываются они в совершенно разных архитектурных уровнях программы. Если Вы выявили ошибку, и сразу же знаете как ее обработать - использовать исключения нет особого смысла, т.к. можно обойтись обычным условием (if). В Вашем примере с датами исключения должны бросаться (throw) в классе Date, а перехватываться (catch) в пользовательском коде где-то в main().
art3330
 Аватар для art3330
9 / 9 / 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
 Аватар для art3330
9 / 9 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.04.2013, 12:18     Исключительные ситуации #6
art3330, НЕ кидайтесь интами/чарами/стрингами/чем бы то ни было, что не является объектом класса исключения. Просто запомните это. Напишите свой класс производный от std::invalid_argument к примеру и кидайтесь им.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.04.2013, 12:22     Исключительные ситуации #7
art3330, после создания своего класса исключений подправьте main() там не хватает блока
C++
1
try {}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
 Аватар для art3330
9 / 9 / 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++ Исключительные ситуации
C++ Исключительные ситуации
C++ Исключительные ситуации!

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

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

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