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

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

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

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

22.04.2013, 11:14. Просмотров 420. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2013, 11:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исключительные ситуации (C++):

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

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

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

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

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

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

9
Tulosba
:)
Эксперт С++
4618 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 11:20 #2
art3330, суть исключений (exception) в том, что срабатывают и обрабатываются они в совершенно разных архитектурных уровнях программы. Если Вы выявили ошибку, и сразу же знаете как ее обработать - использовать исключения нет особого смысла, т.к. можно обойтись обычным условием (if). В Вашем примере с датами исключения должны бросаться (throw) в классе Date, а перехватываться (catch) в пользовательском коде где-то в main().
1
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;
}
0
Tulosba
:)
Эксперт С++
4618 / 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 объект_класса_исключения;
}
...
1
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;
}
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
22.04.2013, 12:18 #6
art3330, НЕ кидайтесь интами/чарами/стрингами/чем бы то ни было, что не является объектом класса исключения. Просто запомните это. Напишите свой класс производный от std::invalid_argument к примеру и кидайтесь им.
0
Tulosba
:)
Эксперт С++
4618 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.04.2013, 12:22 #7
art3330, после создания своего класса исключений подправьте main() там не хватает блока
C++
1
try {}
1
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
1
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
23.04.2013, 12:13  [ТС] #9
Теперь с примером наконец разобрался. Спасибо.

Добавлено через 23 часа 23 минуты
Возникла такая проблема. Работаю с тремя полями. Первое типа string. Два других типа int. Со string все отрабатывает хорошо, при некорректном вводе ловит исключение. А вот с int'ом есть один косяк. Если я ввожу, число из недопустимого диапазона, то исключения ловятся отлично. Если я ввожу строку начинающуюся с буква, то исключения ловится отлично. А вот если я ввожу строку начинающуюся с цифры, например "1фцвфы", то эта единица присваивается в первый int, и у меня вылазит сообщение, что было поймано исключение во втором int'е. Может кто знает, как решить эту проблема?
0
Tulosba
:)
Эксперт С++
4618 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.04.2013, 12:21 #10
art3330, можно читать построчно, т.е. через getline(), потом уже парсить строку.
1
23.04.2013, 12:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2013, 12:21
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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