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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
#1

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

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

Исключения С++ - C++
С++. Перечитал уже много учебников, видел много примеров, но никак не пойму как пользоваться блоками try catch.. Может хоть кто-нибудь...

Исключения - C++
Помогите реализовать класс исключения в данном коде. Задание: Реализуемая функция должна генерировать подходящие исключения. Обработку...

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

Исключения - C++
Как бросить исключение выхода за границы массива? Как его поймать? Что делать после отбрасывания? TItem &amp; TArray::operator (unsigned...

исключения - C++
пожалуйста, gомогите решить задачу на с++ , кoтoрая пoкaзывaет, чтo функция co cвoим блoкoм try не дoлжна пeрeхватывaть кaждую вoзмoжную...

исключения - C++
Есть тестовое задание. Реализовать класс. Есть метод. * @note The function does not validate the index, if the index is out ...

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


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

Добавлено через 38 секунд
а страуструп врушка xD
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 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
xAtom
915 / 740 / 60
Регистрация: 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
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
19.06.2011, 23:20 #9
xAtom, почему не унаследоваться от http://cplusplus.com/reference/std/exception/exception/
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.06.2011, 23:24 #10
Цитата Сообщение от xAtom Посмотреть сообщение
но в JAVA2 без исключений не обойтись там я конечно с исключениями пишу код, там даже обязательство исключение вызывать без этого компилятор-байт кода ругается.
да ладно, на хелло_ворд тоже будет ругаться без исключений?
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
19.06.2011, 23:56 #11
Maxwe11, если функция выбрасывает исключение, не специфицированное в её throws-списке - будет. Либо функция обрабатывает исключение в своём теле, либо перебрасывает дальше, сообщая при этом, что она может выбросить такое-то исключение. Третьего не дано.
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
20.06.2011, 05:57 #12
Цитата Сообщение от xAtom Посмотреть сообщение
По мне так пишу на С++ без исключений это раньше когда новичок был с исключениями
Лучше бы и оставались новичком и писали с исключениями.
Без исключений, программа превращается в спагетти из проверок кода возврата. Для избавления от такого кода (кроме прочего) и были придуманы исключения. Не игнорируй их.)
0
20.06.2011, 05:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2011, 05:57
Привет! Вот еще темы с ответами:

Исключения - C++
У Эккеля, во втором томе, в главе про исключения, встретил конструкцию такого вида: T&amp; operator(int i) throw(RangeError) { if(i...

исключения - C++
скажите пожалуйстокак написать через исключение if(n&lt;=0 || n&gt;=100000000) { fclose(f); f=fopen(&quot;output.txt&quot;, &quot;w&quot;); ...

Исключения - C++
Упражняюсь в программировании. Написал абстрактный класс Shape, от которого наследуются Quadr и Treyg. Создал класс исключения Exeption,...

Исключения - C++
можно ли возвращаться к выполнению кода после обработки исключения, например try{ func1();//обе ф-и могут вызывать исключение...


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

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

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