Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
1

исключения c++

19.06.2011, 17:47. Просмотров 2297. Ответов 11
Метки нет (Все метки)

Здраствуйте! Я тут приспособил код старого проекта чтобы побаловаться с исключениями. Перечитывал я тут недавно главу 14.6 из Страуструпа Язык прграммирования с++. Глава про спецификацию исключений. Он пишет, что если например
Cone max_v(const vector<Cone> &cones) throw(int);
может сгенерировать интовые исключения и если функции нарушит свои обязательства, то вызовется unexpected и так далее. Ну по крайней мере я так понял

Вот собственно код
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// project4Sale.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <vector>
#include <iostream>
 
 
#include "circle.h"
#include "cone.h"
 
using namespace std;
using geometry::Circle;
using geometry::Cone;
 
Cone max_v(const vector<Cone> &cones) throw(int);
double average_s(const vector<Circle> &circles);
 
int _tmain(int argc, _TCHAR* argv[])
{
    size_t              N = 5,  //Circles
                        M = 5;  //Conuses
    
    
 
    vector<Cone> vct;
 
    vct.push_back(Cone(9,76));
    vct.push_back(Cone(2,4));
    vct.push_back(Cone(5,6));
    
 
    try
    {
        try
        {
            max_v(vct).print();
        }
        catch (Cone &cn)
        {
            cn.setRadius(12);
            cn.setHeight(12);
            cn.print();
            throw;
        }
        catch (Circle cr)
        {
            cr.print();
        }
        catch (int)
        {
            cout << "hi";
        }
    }
    catch (Cone cn)
    {
        cn.print();
    }
 
    return 0;
}
 
 
 
 
Cone max_v(const vector<Cone> &cones)
{
    Cone max_tmp(0, 0);
    for (vector<Cone>::const_iterator it = cones.begin(); it != cones.end(); it++) 
    {
        double tmp = max_tmp.v();
        double tmp2 = it->v();
        if ( tmp2 > tmp )
        {
            max_tmp = *it;
        }
        else
        {
            
            throw Circle(5);
        }
    }
 
    return max_tmp;
}
 
double average_s(const vector<Circle> &circles)
{
    double tmp = 0;
 
    for (vector<Circle>::const_iterator it = circles.begin(); it != circles.end(); it++) 
    {
        tmp += it->s();
    }
 
    return ( tmp / circles.size() );
}
всё читать не надо, интересны только строки 16 и 80. В 80-ой строке функция ведь "нарушает взятые на себя обязательства" но никаких unexpected\terminate\abort не происходит, как ни в чём не бывало обрабатывает исключение и работает дальше. Почему? И вобще я щас ещё попробывал throw() то есть функция вобще никаких исключений не должна генерировать, нормально работает

Добавлено через 6 минут
хотя нет, при throw() в конце самом вылетает с ошибкой Необработанное исключение в "0x6290797f (msvcp90d.dll)" в "project4Sale.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
но разве так происходит этот самый вызов unexpected? Кстати в объявлении и в определении можно разные спецификации исключений писать, странно

Добавлено через 7 минут
вот ещё появился вопрос
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
#ifndef CIRCLE_H
#define CIRCLE_H
 
#pragma once
 
#include <iostream>
 
 
namespace geometry {
 
    const double M_PI = 3.1415;
 
    class Circle
    {
    protected:
        double R;       //радиус
    public:
        Circle() throw();
        Circle(const Circle&) throw();
        Circle(const double& _r) throw();
 
 
        Circle&         operator=(const Circle&) throw();
        
        virtual Circle&         setRadius(const int&) throw();
 
        virtual double          s() const throw();      //Площадь
        virtual double          l() const throw();      //Длинна
        virtual double          r() const throw();      //Собственно радиус
 
        void            print() const;
 
        
 
        ~Circle();
 
    };
 
 
}
 
#endif
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
#ifndef CONE_H
#define CONE_H
 
#pragma once
 
#include <iostream>
#include <cmath>
#include "circle.h"
 
 
namespace geometry
{
 
 
    class Cone :
        public virtual Circle
    {
    private:
        double H; //Высота
    public:
        Cone();
        Cone(const Cone&);
        Cone(const double& radius, const double& height);
 
        Cone&           operator=(const Cone&);
 
        Cone&           setHeight(const double&);
        double          v() const /*throw()*/;
        double          s() const /*throw()*/;
 
        void            print() const;
 
 
        ~Cone();
    };
 
 
 
 
}
 
#endif
всё читать необязательно, главное обратить внимание на функцию s(). Вроде ведь можно заместить её методом с не меннее ограничительной спецификацией, в классе circle она не выбрасывает исключений, а в классе cone она замещена функцией которая выбрасывает любые исключения, как так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2011, 17:47
Ответы с готовыми решениями:

исключения
Есть тестовое задание. Реализовать класс. Есть метод. * @note The function does not validate...

Исключения
Здравствуйте, у меня есть немножко глупый вопрос: есть скажем функция a() { some code } Все...

Исключения в С++
Есть 3 массива arrA, arrB, arrC. В массиве А хранятся числа типа float, в массиве В хранятся числа...

исключения
скажите пожалуйстокак написать через исключение if(n&lt;=0 || n&gt;=100000000) { fclose(f);...

11
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
19.06.2011, 18:03 2
В большинстве "умных" книжек сказано, что на практике использование любой спецификации, кроме пустого throw не имеет смысла. Т.е. реализация и поведение будет сильно зависеть от версии компилятора и не надо себе пудрить голову. Или пустой throw или ничего.
1
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
19.06.2011, 18:11  [ТС] 3
имеет ли это смысл это другой вопрос, главное что в книги написано одно, а на самом деле происходит совсем другое. То есть я правильно понимаю, что здесь имеет место несоответсвие? Я же всё делал как по книге, а результат не соответсвует описанному в книге. Я впринципе не удивлён, помоему у страуса ещё и про раздельную компиляцию шаблонов было написано, которую ни один из мне известных компиляторов не поддерживает, но это всё... печально
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
19.06.2011, 18:17 4
То ли у Саттера, то ли у Александреску читал, не помню.. В общем, когда указывается throw с параметрами, то код оборачивается трайем, который перехватывает заданные виды исключений. Если выброшенное исключение совпадает со списком, то оно пересылается дальше, если нет - генерируется unexpected или ещё чего, не помню. Суть в том, что это пустая трата времени. Т.к. знать все возможные исключения проблематично. Поэтому некоторые компиляторы вообще игнорируют спецификацию, отличную от пустого throw.
При этом сообщать об отсуствии исключений смысл есть, т.к. позволяет компилятору лучше оптимизировать код. А вот что будет, есть функция со спецификатором throw выбросит исключение, я не помню.)
1
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
19.06.2011, 18:23  [ТС] 5
про оборачивае траем и у страуса написано


Цитата Сообщение от Deviaphan Посмотреть сообщение
некоторые компиляторы вообще игнорируют спецификацию, отличную от пустого throw
видимо мелкомягкий компилятор один из них(

Добавлено через 38 секунд
а страуструп врушка xD
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
19.06.2011, 18:24 6
Цитата Сообщение от pito211 Посмотреть сообщение
видимо мелкомягкий компилятор один из них(
А то.) Хотя в 2010 не проверял.
0
alex_x_x
19.06.2011, 18:26
  #7

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
То ли у Саттера, то ли у Александреску читал, не помню
или у Саттера, или у Майерса

0
929 / 754 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
19.06.2011, 22:44 8
По мне так пишу на С++ без исключений это раньше когда новичок был с исключениями, но в JAVA2 без исключений не обойтись там я конечно с исключениями пишу код, там даже обязательство исключение вызывать без этого компилятор-байт кода ругается. Вот мой пример реализации исключений, ведь исключения напоминают обычные goto прыжки.
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
65
66
67
// класс - для исключительных сообщений
class  texception {
private:
    char  message[255];
public:
    texception(void) {}
    texception(const char* _msg) {
        strcpy(message, _msg);
    }
    const char*  getMessage(void) const {
         return message;
    }
};
 
 
 
// тестирующий класс
class  _test {
public:
 
    void is_test(const char* p) throw() {
        if( p == NULL)  // эмулируем ошибки-исключений
            throw texception("NULL  pointer CRT...");
        if(! stricmp(p, "hello"))
            throw texception("good moning, user !!!");
    }
 
};
 
 
 
 
void  main(void){
 
    _test test;
 
    system("color 17");
 
    try  {
        test.is_test( getenv("PATH_INFO") );
    } catch(texception  _err) {
        puts( _err.getMessage() );
    }
 
    // здесь бросок будет
    try  {
        test.is_test("hello");
    } catch(texception  _err) {
        puts( _err.getMessage() );
    }
 
 
    // здесь броска не будет
    try  {
        test.is_test("сейчас не будет с генерировано исключение");
        puts( "" );
    } catch(texception  _err) {
        puts( _err.getMessage() );
    }
 
 
    // здесь  тоже бросок будет
    try {
        test.is_test( NULL );
    } catch(...) {
        puts("ERROR EXCEPTION !!!");
    }
0
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
19.06.2011, 23:20 9
xAtom, почему не унаследоваться от http://cplusplus.com/reference... exception/
0
Каратель
Эксперт С++
6594 / 4015 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.06.2011, 23:24 10
Цитата Сообщение от xAtom Посмотреть сообщение
но в JAVA2 без исключений не обойтись там я конечно с исключениями пишу код, там даже обязательство исключение вызывать без этого компилятор-байт кода ругается.
да ладно, на хелло_ворд тоже будет ругаться без исключений?
0
Эксперт С++
5037 / 3097 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
19.06.2011, 23:56 11
Maxwe11, если функция выбрасывает исключение, не специфицированное в её throws-списке - будет. Либо функция обрабатывает исключение в своём теле, либо перебрасывает дальше, сообщая при этом, что она может выбросить такое-то исключение. Третьего не дано.
1
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
20.06.2011, 05:57 12
Цитата Сообщение от xAtom Посмотреть сообщение
По мне так пишу на С++ без исключений это раньше когда новичок был с исключениями
Лучше бы и оставались новичком и писали с исключениями.
Без исключений, программа превращается в спагетти из проверок кода возврата. Для избавления от такого кода (кроме прочего) и были придуманы исключения. Не игнорируй их.)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.06.2011, 05:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Исключения
Ребят, тут такая тема. В общем нужно при вводе данных смотреть на исключения, т.е. если ввели в int...

Исключения
У Эккеля, во втором томе, в главе про исключения, встретил конструкцию такого вида: T&amp;...

Исключения
можно ли возвращаться к выполнению кода после обработки исключения, например try{...

Исключения
Добрый день! Почему если поймало исключение то зацикливается? А если поставить в блок catch - слово...


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

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

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