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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
19.06.2011, 17:47     исключения c++ #1
Здраствуйте! Я тут приспособил код старого проекта чтобы побаловаться с исключениями. Перечитывал я тут недавно главу 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 она замещена функцией которая выбрасывает любые исключения, как так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2011, 17:47     исключения c++
Посмотрите здесь:

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


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

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

Не по теме:

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

xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
19.06.2011, 22:44     исключения c++ #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 !!!");
    }
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
19.06.2011, 23:20     исключения c++ #9
xAtom, почему не унаследоваться от http://cplusplus.com/reference/std/exception/exception/
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2011, 23:24     исключения c++ #10
Цитата Сообщение от xAtom Посмотреть сообщение
но в JAVA2 без исключений не обойтись там я конечно с исключениями пишу код, там даже обязательство исключение вызывать без этого компилятор-байт кода ругается.
да ладно, на хелло_ворд тоже будет ругаться без исключений?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.06.2011, 23:56     исключения c++ #11
Maxwe11, если функция выбрасывает исключение, не специфицированное в её throws-списке - будет. Либо функция обрабатывает исключение в своём теле, либо перебрасывает дальше, сообщая при этом, что она может выбросить такое-то исключение. Третьего не дано.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2011, 05:57     исключения c++
Еще ссылки по теме:

C++ Исключения
Исключения C++
C++ исключения

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.06.2011, 05:57     исключения c++ #12
Цитата Сообщение от xAtom Посмотреть сообщение
По мне так пишу на С++ без исключений это раньше когда новичок был с исключениями
Лучше бы и оставались новичком и писали с исключениями.
Без исключений, программа превращается в спагетти из проверок кода возврата. Для избавления от такого кода (кроме прочего) и были придуманы исключения. Не игнорируй их.)
Yandex
Объявления
20.06.2011, 05:57     исключения c++
Ответ Создать тему
Опции темы

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