Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поговорим про исключения 
:(
    Опции темы
Kuvaldis
Дата 28.10.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Есть у меня преподаватель, с легкой руки которого мы здесь на нескольких листах рассуждали о строках в С++
НА очереди исключения...
Ссылаясь на интервью Хейлсберга - автора С#(правда, я их не нашел), были даны принципы использования исключений, не нарушающих принципы структурного программирования:
1. Все исключения должны иметь общий базовый класс

2. Объекты исключений должны располагаться в динам. памяти. Это камень в сторону С++. Таким образом мы не можем сказать, откуда в общем случае пришло исключение. + многократное копирование по стеку при раскрутке (есть в Страуструпе)

3. В объекте должна быть ссылка на предыдущее исключение в контексте которого возникла данная (так сделано в .NET только c Frammework 2.0 )

4. Использование исключений для управления ходом работы проги зарещено. (у Страуструпа есть и намеки на такое нецелевое использование)

5. Касается того, что все таки объекты должны быть только динамические -> слова по поводу try... finally (уже обсуждали)

6. Обработка исключений с поглощением допустима лишь на самом верхнем уровне (сюда цикл обработки сообщений и т.д)

Скажу так: препод этот очень грамотный, работает как раз на С++, в Check Point (который делает Zone Alarm и т.д.) Т.е. в компетентности его сомневаться не приходится. Но сам он дельфист.

В общем, хотелось бы услышать ваше мнение, дорогие форумчане smile

СУВ, Kuvaldis

Это сообщение отредактировал(а) Kuvaldis - 11.1.2008, 11:22


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
archimed7592
Дата 28.10.2007, 23:26 (ссылка) |   (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Ыыыы, стрелять этих Дельфистов надо... smile
Ну давай поговорим smile.

Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
1. Все исключения должны иметь общий базовый класс

Угу... Должны... std::exception для того и сделан(а также несколько классов std::logic_error, std::domain_error и т.д.)...
И тем не менее, страна свободная, свобода слова и т.п. - никто не мешает тебе бросить int или char * или объект пользовательского типа, не являющегося наследником std::exception.


Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
2. Объекты исключений должны располагаться в динам. памяти. Это камень в сторону С++. Таким образом мы не можем сказать, откуда в общем случае пришло исключение. + многократное копирование по стеку при раскрутке (есть в Страуструпе)

1. Зачем? Ну будут они в "динамической памяти"(она что, чем-то отличается? 0_о) - что изменится?
2. Многократных копирований реализации имеют право избегать и, поверь, они именно так и поступают.
3. Копирования не избежать, если написано catch(MyException e){ ... }, но что мешает написать catch(const MyException &e){ ... }(опять же свобода программерского слова - хочет копирований пишет так, не хочет - пишет "нормально")?


Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
3. В объекте должна быть ссылка на предыдущее исключение в контексте которого возникла данная (так сделано в .NET только c Frammework 2.0 )

А можно пример для тупых и, желательно на пальцах что это такое и зачем это нужно, потому что я могу бросить исключение просто так(потому что мне не понравился нулевой указатель, к примеру) - куда будет ссылаться такая "ссылка на предыдущее исключение"?

Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
4. Использование исключений для управления ходом работы проги зарещено. (у Страуструпа есть и намеки на такое нецелевое использование)

Согласен... И тем не менее, в .NET'е они используются для того, чтобы прервать поток, к примеру smile.
Утверждение в общем случае хорошее, но, оно применимо к любому языку, ибо ни один язык не может запретить пользоваться тебе исключениями вместо if'а.


Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
5. Касается того, что все таки объекты должны быть только динамические -> слова по поводу try... finally (уже обсуждали)

finally? С++ имеет семантику автоматический объектов и, посему finally ему не нужен по определению(RAII).

Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
6. Обработка исключений с поглощением допустима лишь на самом верхнем уровне (сюда цикл обработки сообщений и т.д)

Крайне неверное утверждение. Ошибка должна обрабатываться в том месте, которое умеет эту ошибку обрабатывать(читай в том месте, которое знает что с ней делать), не раньше и не позже. Примеры приводить нужно?


Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
Скажу так: препод этот очень грамотный, работает как раз на С++, в Check Point (который делает Zone Alarm и т.д.) Т.е. в компетентности его сомневаться не приходится. Но сам он дельфист.

В его авторитете я не сомневаюсь, также, как и не сомневаюсь в том, что отсутствие в языке семантики автоматических объектов(как класса вообще), отсутствие понятия константности объекта, отсутствие статических инструментов(всё в run-time), а также, наличие сборщика мусора(относится к джава-дотнетам) проедает мозг, накладывает отпечаток и т.д., так что в компетентности Дельфистов относительно устройства языка С++(а точнее того, что они хотели бы сделать из С++) я сомневаюсь smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Kuvaldis
Дата 28.10.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



archimed7592
Цитата

можно пример для тупых и, желательно на пальцах что это такое и зачем это нужно, потому что я могу бросить исключение просто так(потому что мне не понравился нулевой указатель, к примеру) - куда будет ссылаться такая "ссылка на предыдущее исключение"?

Честно говоря, я это и хотел в интервью найти, но не нашел. :( Не знаю, просветить не успели, так как пара закончилась 
Но эту фичу можно и не юзать (ссылка 0 )
Цитата

Крайне неверное утверждение. Ошибка должна обрабатываться в том месте, которое умеет эту ошибку обрабатывать(читай в том месте, которое знает что с ней делать), не раньше и не позже. Примеры приводить нужно?

имелось в виду throw;   // повторная генерация


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
marcusmae
Дата 28.10.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Нда, это в целом очень напоминает .NET-овые исключения : базовый класс Exception, исключения хранят ссылки на дерево вложенных исключений, приведших к данному, хранят трассу вызовов, в связи с чем не очень понятно утверждение о том, что

Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
Таким образом мы не можем сказать, откуда в общем случае пришло исключение.


помимо это специализируются (например, ArgumentException в числе прочего указывает на имя аргумента).

С одной стороны, подход грамотный при разработке больших и/или устойчивых, защищённых программ. Надстройка над C#, SpeC# форсирует проработку исключений введением контрактов на вызовы, например :
Код

public virtual
int BinarySearch(int index , int count , object val , IComparer comparer )
    requires 0<=index otherwise ArgumentOutOfRangeException ;
    requires 0<=count otherwise ArgumentOutOfRangeException ;
    requires count <=this.Count − index otherwise ArgumentException ;
    requires comparer == null ==>
        value is IComparable || Forall{int i in{index : index + count}; this[i] is IComparable} otherwise     
            ArgumentException ;
    requires comparer == null && value != null ==>
        Forall{int i in{index : index + count}; this[i] != null ==>
            this[i].GetType().IsAssignable(value.GetType()) ||
            value.GetType().IsAssignable(this[i].GetType())}  
                otherwise InvalidOperationException ;

    ...


С другой стороны, невполне ясно, какое это может найти выражение в плюсах, где исключения есть, но их поддержка намного слабее.

Цитата(Kuvaldis @  28.10.2007,  22:59 Найти цитируемый пост)
Использование исключений для управления ходом работы проги зарещено.

Хм, а по-моему, практикуется. Допустим, если какой-то catch-блок несумел обработать исключение, то он пробрасывает его вверх более общим обработчикам, а если сумел, то "проглотил" ошибку, и программа поехала себе дальше. Чем не управление?

Добавлено через 14 минут и 29 секунд
Цитата(archimed7592 @  28.10.2007,  23:26 Найти цитируемый пост)
не сомневаюсь в том, что отсутствие в языке семантики автоматических объектов(как класса вообще), отсутствие понятия константности объекта, отсутствие статических инструментов(всё в run-time), а также, наличие сборщика мусора(относится к джава-дотнетам) проедает мозг, накладывает отпечаток и т.д.


Ха-ха smile Хорошие доводы, archimed7592.
Не считаю свой мозг совсем уж проеденым, все больше и больше отхожу от .NET к плюсам, и чувствую себя в них намного комфортнее smile

Это сообщение отредактировал(а) marcusmae - 28.10.2007, 23:48


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Lazin
Дата 29.10.2007, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(archimed7592 @  28.10.2007,  23:26 Найти цитируемый пост)
А можно пример для тупых и, желательно на пальцах что это такое и зачем это нужно, потому что я могу бросить исключение просто так(потому что мне не понравился нулевой указатель, к примеру) - куда будет ссылаться такая "ссылка на предыдущее исключение"?

Цитата(archimed7592 @  28.10.2007,  23:26 Найти цитируемый пост)
Крайне неверное утверждение. Ошибка должна обрабатываться в том месте, которое умеет эту ошибку обрабатывать(читай в том месте, которое знает что с ней делать), не раньше и не позже. Примеры приводить нужно?

Иногда бывает так, что хрен поймешь как ошибку обрабатывать, как например обработать ошибку доступа. Такие ошибки приводят к тому что программа падает, причем у клиента. А система обработки исключений, в этом случае должна помочь разработчикам сего глюкалова понять из-за чего это происходит, т-есть получить информацию о контексте выполнения программы в этот момент.
PM MAIL Skype GTalk   Вверх
archimed7592
Дата 29.10.2007, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Kuvaldis @  28.10.2007,  23:45 Найти цитируемый пост)
Но эту фичу можно и не юзать (ссылка 0 )

Да чего юзать или нет это вопрос десятый smile.
Я не понимаю зачем нужна ссылка на какое-то мифическое предыдущее исключение(по какому принципу они хоть упорядычиваются? какое предыдущее, а какое следующее? smile)...

Цитата(Kuvaldis @  28.10.2007,  23:45 Найти цитируемый пост)
имелось в виду throw;   // повторная генерация 

Гхм... Опять я тебя не понимаю: давай на пальцах, что подразумевалось под исходным утверждением и при чём здесь rethrow?

Цитата(marcusmae @  28.10.2007,  23:46 Найти цитируемый пост)
С другой стороны, невполне ясно, какое это может найти выражение в плюсах, где исключения есть, но их поддержка намного слабее.

А можно конструктивно: что понимается под слабой поддержкой исключений и чем С++ в этом плане слабже .net'а?

Цитата(Lazin @  29.10.2007,  09:26 Найти цитируемый пост)
Иногда бывает так, что хрен поймешь как ошибку обрабатывать, как например обработать ошибку доступа. Такие ошибки приводят к тому что программа падает, причем у клиента. А система обработки исключений, в этом случае должна помочь разработчикам сего глюкалова понять из-за чего это происходит, т-есть получить информацию о контексте выполнения программы в этот момент. 

Ну, скажем, в том же .net "мощная система исключений" позволяет полностью узнать контекст, IIRC, только в отладочном режиме.
Опять же, что понимается под "должна помочь разработчикам сего глюкалова понять из-за чего это происходит, т-есть получить информацию о контексте выполнения программы в этот момент." - на пальцах(на примерах).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 29.10.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  29.10.2007,  10:02 Найти цитируемый пост)
А можно конструктивно: что понимается под слабой поддержкой исключений и чем С++ в этом плане слабже .net'а?

я ни в коем случае не сторонник .NET
но мне кажется управляемый код априорно более гибок (но не быстр естественно) во всех отношениях (и в плане исключений в частности)
динамическое формирование кода, перекомпиляция в run-time и все такое


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 29.10.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(MAKCim @  29.10.2007,  10:09 Найти цитируемый пост)
я ни в коем случае не сторонник .NET

Типа, отмазался smile.

Цитата(MAKCim @  29.10.2007,  10:09 Найти цитируемый пост)
но мне кажется управляемый код априорно более гибок (но не быстр естественно) во всех отношениях (и в плане исключений в частности)

В априоре гибком коде возможно RAII? Или может быть там возможны такие же мощные(читай compile-time) шаблоны?
Список можно продолжить smile.

Цитата(MAKCim @  29.10.2007,  10:09 Найти цитируемый пост)
динамическое формирование кода

Рефлексия? Да ну её... Ну вот ты хоть раз динамически чего-нибудь формировал? smile

Цитата(MAKCim @  29.10.2007,  10:09 Найти цитируемый пост)
перекомпиляция в run-time и все такое 

Речь про JIT? А в чём плюсы этого подхода(кроме мифической кроссплатформенности)?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
griker
Дата 29.10.2007, 10:33 (ссылка)   | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


MDMA
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 14.7.2006
Где: Tallinn

Репутация: нет
Всего: 8



Да ладно чуваки... Расслабтесь посмотрите какой - нибудь фильм... А потом на свежую голову сядете за комп


--------------------
I don't respect police
PM MAIL   Вверх
MAKCim
Дата 29.10.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  29.10.2007,  10:17 Найти цитируемый пост)
Речь про JIT? А в чём плюсы этого подхода(кроме мифической кроссплатформенности)? 

нет, не только в кроссплатформенности
допустим есть некоторый код, который постоянно выполняется (какой-нибудь сервер)
виртуальная машина (CLR, JRE) в зависимости от внешних факторов (например какая-либо ветвь кода выполняется только в 5% всех случаев) может перекомпилировать (=оптимизировать) код с их учетом
Цитата(archimed7592 @  29.10.2007,  10:17 Найти цитируемый пост)
Рефлексия? Да ну её... Ну вот ты хоть раз динамически чего-нибудь формировал?

ну согласись, это тоже не аргумент
я лично вообще особо с .NET/Java не работал, с Reflection тем более
но это же не означает, что она бесполезна
Цитата(archimed7592 @  29.10.2007,  10:17 Найти цитируемый пост)
Или может быть там возможны такие же мощные(читай compile-time) шаблоны?
Список можно продолжить

опять таки, в С++ compile-time шаблоны, в .NET run-time
и что?
это ортогональные понятия
с другой стороны, модифицировав компилятор какого-либо языка .NET, можно получить те же мощные compile-time шаблоны
а вот обратное не верно (т. е какую-либо фишку .NET легко портировать в С++)
что я так .NET защищаю  smile  smile 

Добавлено через 4 минуты и 8 секунд
Цитата(MAKCim @  29.10.2007,  10:34 Найти цитируемый пост)
кроме мифической кроссплатформенности

кроссплатформенность то настоящая
тут просто много других причин (это про .NET)
ну а Java реально кроссплатформенна


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
archimed7592
Дата 29.10.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(MAKCim @  29.10.2007,  10:34 Найти цитируемый пост)
допустим есть некоторый код, который постоянно выполняется (какой-нибудь сервер)
виртуальная машина (CLR, JRE) в зависимости от внешних факторов (например какая-либо ветвь кода выполняется только в 5% всех случаев) может перекомпилировать (=оптимизировать) код с их учетом

Опять же - мифическая возможность smile.
Реальные JIT'ы так делают? Сомневаюсь.


Цитата(MAKCim @  29.10.2007,  10:34 Найти цитируемый пост)
ну согласись, это тоже не аргумент
я лично вообще особо с .NET/Java не работал, с Reflection тем более
но это же не означает, что она бесполезна

Ну почти бесполезна smile.
Она помогает, дизайнеру, к примеру, узнать какие есть свойства у компонента(пользовательского).
Мы где-то на исходниках холиварили на тему применимости рефлексии - ничего убедительного в пользу рефлексии сказанно не было.


Цитата(MAKCim @  29.10.2007,  10:34 Найти цитируемый пост)
опять таки, в С++ compile-time шаблоны, в .NET run-time
и что?
это ортогональные понятия

Опять таки: ты знаком с тем, как реализуются run-time шаблоны в .net? smile
По идее, то же самое можно сделать в С++ с помощью интерфейсов и обыновенных(нешаблонных) классов smile.

Добавлено через 2 минуты и 35 секунд
griker, ты по моему перепутал тематику с флеймом.


Цитата(MAKCim @  29.10.2007,  10:34 Найти цитируемый пост)
кроссплатформенность то настоящая
тут просто много других причин (это про .NET)
ну а Java реально кроссплатформенна 

Хорошо, С++ тоже кроссплатформеный smile. Только перекомпилировать нужно самому smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 29.10.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(archimed7592 @  29.10.2007,  10:40 Найти цитируемый пост)
Реальные JIT'ы так делают? Сомневаюсь.

я слышал от компетентного источника, что JVM  так делает
ничего другого сказать не могу
вообще
мы говорим о реализациях концепции управляемого кода или о самой концепции?  smile 
Цитата(archimed7592 @  29.10.2007,  10:40 Найти цитируемый пост)
Опять таки: ты знаком с тем, как реализуются run-time шаблоны в .net? smile
По идее, то же самое можно сделать в С++ с помощью интерфейсов и обыновенных(нешаблонных) классов

тут надо какого-нибудь авторитетного человека, который хорошо знаком с .NET
например Aldan

Добавлено через 2 минуты и 10 секунд
Цитата(archimed7592 @  29.10.2007,  10:40 Найти цитируемый пост)
Хорошо, С++ тоже кроссплатформеный smile. Только перекомпилировать нужно самому

 smile я не спорю
только типы кроссплатформенности разные

Это сообщение отредактировал(а) MAKCim - 29.10.2007, 10:51


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lazin
Дата 29.10.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Я бы хотел напомнить что тема называется: Поговорим про исключения
Цитата(archimed7592 @  29.10.2007,  10:02 Найти цитируемый пост)
Опять же, что понимается под "должна помочь разработчикам сего глюкалова понять из-за чего это происходит, т-есть получить информацию о контексте выполнения программы в этот момент." - на пальцах(на примерах). 

Видел когданибудь в ХР окошко с сообщением: "Программа выполнила недопустимую инструкцию и будет закрыта, бла-бла-бла..." - так-вот это поведение по умолчанию при возникновении необработанного исключения, и его можно переопределить. Например можно предложить пользователю послать отчет об ошибке разработчикам. 
PM MAIL Skype GTalk   Вверх
archimed7592
Дата 29.10.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Lazin @  29.10.2007,  11:18 Найти цитируемый пост)
Я бы хотел напомнить что тема называется: Поговорим про исключения

Да что там - Макс главный флудогон этого раздела smile.


Цитата(Lazin @  29.10.2007,  11:18 Найти цитируемый пост)
Видел когданибудь в ХР окошко с сообщением: "Программа выполнила недопустимую инструкцию и будет закрыта, бла-бла-бла..." - так-вот это поведение по умолчанию при возникновении необработанного исключения, и его можно переопределить. Например можно предложить пользователю послать отчет об ошибке разработчикам.

Видел. К чему всё это? К тому что бывают исключения про которые "забыли"? И то, что в этом случае помогут ссылки на "предыдущие" исключения? Хорошо, допустим... Осталось понять как они помогут и по какому принципу они предыдущие и следующие?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 29.10.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Lazin @  29.10.2007,  11:18 Найти цитируемый пост)
Я бы хотел напомнить что тема называется: Поговорим про исключения

а никто и не забывал, высказывайтесь  smile 
конструктивный спор, логически связанный с предметом основного обсуждения, вполне уместен

Это сообщение отредактировал(а) MAKCim - 29.10.2007, 11:43


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 29.10.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Ребят, а вот насчет вложенных исключений. В можно ли в С++ защищенные секции вкладывать друг в друга? Чтобы отрабатывать корректно  исключения. 
  Например в делфях я могу написать так
Код

try 
  F := TFileStream.Create('mt.txt', fmOpenReadWrite);
  try
   F.read(s[1], 17);  
   F.Free;
  except 
    ShowMessage('ошибка чтения файла');   
    F.Free;
  end;
Except
 ShowMessage('ошибка доступа к файлу');
end;





--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 29.10.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(archimed7592 @  29.10.2007,  11:24 Найти цитируемый пост)
Видел. К чему всё это? К тому что бывают исключения про которые "забыли"?

А что произойдет, например, при обращении к уже удаленному объекту, из-за какой-нибудь ошибки. Даже если ты знаешь как это событие перехватить, то как потом его обрабатывать? Единственный вменяемый способ - не обрабатывать такое исключение, а пропустить его, чтоб оно дошло до самого до main-a  smile .
Цитата(archimed7592 @  29.10.2007,  11:24 Найти цитируемый пост)
И то, что в этом случае помогут ссылки на "предыдущие" исключения? Хорошо, допустим... Осталось понять как они помогут и по какому принципу они предыдущие и следующие? 

Вложенные исключения нужны для того что-бы определить первоначальный источник исключения, наверное:
Код

try
{
} catch (const std::exception* except)
{
 if (можем продолжить)
 {
   *****
 } else
      throw new myexception(except);//обычно здесь пишут throw;
}

разница в том, что исключение сохраняет информацию о всех обработчиках, в которых оно было перехвачено
вам оно надо, мне лично нет 


Это сообщение отредактировал(а) Lazin - 29.10.2007, 16:54
PM MAIL Skype GTalk   Вверх
archimed7592
Дата 29.10.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  29.10.2007,  11:47 Найти цитируемый пост)
  Ребят, а вот насчет вложенных исключений. В можно ли в С++ защищенные секции вкладывать друг в друга? Чтобы отрабатывать корректно  исключения. 
  Например в делфях я могу написать так

Да, конечно.

Цитата(Lazin @  29.10.2007,  12:41 Найти цитируемый пост)
А что произойдет, например, при обращении к уже удаленному объекту, из-за какой-нибудь ошибки. Даже если ты знаешь как это событие перехватить, то как потом его обрабатывать? Единственный вменяемый способ - не обрабатывать такое исключение, а пропустить его, чтоб оно дошло до самого до main-a  smile .

Ну эт очевидно, по моему smile.

Цитата(Lazin @  29.10.2007,  12:41 Найти цитируемый пост)
Вложенные исключения нужны для того что-бы определить первоначальный источник исключения, наверное:
...
...
вам оно надо, мне лично нет 

Мне тоже не надо smile.



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Lazin
Дата 29.10.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alexeis @  29.10.2007,  11:47 Найти цитируемый пост)
  Ребят, а вот насчет вложенных исключений. В можно ли в С++ защищенные секции вкладывать друг в друга? Чтобы отрабатывать корректно  исключения. 
  Например в делфях я могу написать так

Можно, но только возможностей немного больше, в этом-то и проблема, возможностей дофига, и пользоваться ими можно поразному, но не все из того что можно есть гут
PM MAIL Skype GTalk   Вверх
akizelokro
Дата 29.10.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Возвращаясь к заявленной теме. В идеале каждую программу нужно делать как отказоустойчивую. На практике этого добиться не удается очень часто ( читай, - практически всегда). Но есть программы с требованиями повышенной "плавучести". В идеале, С++ должен предоставить для программиста соответствующие возможности. С наиболее простым вариантом - одиночным исключением все понятно. Исключение возбуждено, обработчик перехватил его, обработал, принял "соответствующие" меры и передал управление в программу (без аварийного завершения). Но, посмотрим, как все может произойти (обязательно произойдет) на практике. В блоке try - catch исключение. Прежде чем оно передается в блок catch(ESomeExceprion e), освобождаются локальные переменные. Для объектов вызываются их деструкторы. Я могу прописать в деструктор некоего объекта дополнительные действия помимо освобождения памяти. Например, возвращая контекст некоего устройства в прежнее состояние. Что происходит с обработкой предыдущего исключения, если в этот момент возбуждается новое?

Это сообщение отредактировал(а) akizelokro - 29.10.2007, 15:51


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 29.10.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  29.10.2007,  15:51 Найти цитируемый пост)
Что происходит с обработкой предыдущего исключения, если в этот момент возбуждается новое?

Вызывается std::terminate(), который в свою очередь std::abort().

Добавлено через 1 минуту и 34 секунды
Так что про "старое" исключение можно забыть, как и про всю программу.
Читаем классиков: деструктор не должен выпускать исключений!


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 29.10.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(akizelokro @  29.10.2007,  15:51 Найти цитируемый пост)
Что происходит с обработкой предыдущего исключения, если в этот момент возбуждается новое?

  ИМХО зависит от самого блока catch, прежнее прервется, обработается новое, если нет своего перехватчика, то обработка предыдущего должна прерваться, если есть то продолжиться после окончания вложенного перехватчика.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 29.10.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Alexeis, читай выше - если во время отмотки стека вывалится ещё одно исключение, то вывалится вся прога.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 29.10.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



archimed7592, если внутри catch сделать еще одну защищенную секцию, дальше если внутри этой вложенной секции опять возникнет исключение, что неужели не сработает catch это вложенной секции?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
akizelokro
Дата 29.10.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

ИМХО зависит от самого блока catch, прежнее прервется, обработается новое, если нет своего перехватчика, то обработка предыдущего должна прерваться, если есть то продолжиться после окончания вложенного перехватчика. 

Здесь мне не все ясно. В книгах описания ситуации я не встречал. Но судя по принципам обработки, в этом случае получается ерунда. Второе исключение возбуждено в пределах try{}, оно "пропиливает" стэк, продолжая освобождать еще не освобожденные локальные объекты. После раскрутки стэка и перехвата исключения выполнение программы должно по идее перейти к следующей за try-catch блоком инструкции. Если же программа возвращается к обработке первичного исключения, то (предположу), что вновь будет предпринята попытка "раскрутки" стэка с непредсказуемыми последствиями smile . Стэк уже единожды раскручен?
Также, где хранится "значение" для первичного исключения? В вершине стэка? 


Это я рассматриваю тот случай, когда на каждое из двух исключений есть свой обработчик, не завершающий выполнение программы. Либо catch(...) не отфутболивает с помощью throw() исключение по цепочке.

Это сообщение отредактировал(а) akizelokro - 29.10.2007, 16:30


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 29.10.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  29.10.2007,  16:16 Найти цитируемый пост)
archimed7592, если внутри catch сделать еще одну защищенную секцию, дальше если внутри этой вложенной секции опять возникнет исключение, что неужели не сработает catch это вложенной секции?

На примере понятней будет?
Код

#include <ostream>
#include <iostream>
struct A
{
     ~A()
     {
         throw 1;
     }
};

int main()
{
     try
     {
         A a;
         throw 2;
     }
     catch(int e)
     {
         std::cout << e << std::endl;
     }
}

Код

archimed7592@PC ~/testlabs/g++
$ g++ ./main.cpp

archimed7592@PC ~/testlabs/g++
$ ./a.exe

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

archimed7592@PC ~/testlabs/g++
$


Добавлено через 3 минуты и 2 секунды
Цитата(akizelokro @  29.10.2007,  16:23 Найти цитируемый пост)
Здесь мне не все ясно.
бла-бла-бла...

Тебе цитату из стандарта привести, где написано что будет, если во время раскрутки стека вывалится исключение?
Чё демагогию разводить то?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 29.10.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

Тебе цитату из стандарта привести, где написано что будет, если во время раскрутки стека вывалится исключение?

Приведи. Я еще учебник не одолел, так что мне стандарт штудировать еще рано. А учитывая количество литературы, в которой я закопался, и то, что мою работу с меня никто не снимал, просто нет времени.  smile 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Alexeis
Дата 29.10.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



archimed7592, я не вижу чтобы строчка 
Цитата(archimed7592 @  29.10.2007,  16:42 Найти цитируемый пост)
 std::cout << e << std::endl;

Была в защищенной секции...

Добавлено через 1 минуту и 36 секунд
типа такого
Код

#include <ostream>
#include <iostream>
struct A
{
     ~A()
     {
         throw 1;
     }
};
int main()
{
     try
     {
         A a;
         throw 2;
     }
     catch(int e)
     {
       try
       {
         std::cout << e << std::endl;
       }
       .........
     }
}

вот тогда что произойдет?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 29.10.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alexeis @  29.10.2007,  16:03 Найти цитируемый пост)
ИМХО зависит от самого блока catch, прежнее прервется, обработается новое, если нет своего перехватчика, то обработка предыдущего должна прерваться, если есть то продолжиться после окончания вложенного перехватчика. 

Возможно Alexeis, имел ввиду следующее:
Код

try
{
   throw -1;
} catch (const int& except) {
 try {
  printf("exception code %d", except);
  throw;
 } catch (...) 
 {
   printf("...");
 }
}

млин, он меня опередил 0_o

Это сообщение отредактировал(а) Lazin - 29.10.2007, 17:01
PM MAIL Skype GTalk   Вверх
JackYF
Дата 29.10.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Alexeis @  29.10.2007,  16:54 Найти цитируемый пост)
std::cout << e << std::endl;

если здесь возникнет исключение, тогда std::terminate().


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 29.10.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  29.10.2007,  16:51 Найти цитируемый пост)
Приведи.

Цитата
15.5.1 The terminate() function
In the following situations exception handling must be abandoned for less subtle error handling techniques:
— when the exception handling mechanism, after completing evaluation of the expression to be thrown but before the exception is caught (15.1), calls a user function that exits via an uncaught exception,
— when the exception handling mechanism cannot find a handler for a thrown exception (15.3), or
— when the destruction of an object during stack unwinding (15.2) exits using an exception, or
— when construction or destruction of a non-local object with static storage duration exits using an exception (3.6.2), or
— when execution of a function registered with atexit exits using an exception (18.3), or
— when a throw-expression with no operand attempts to rethrow an exception and no exception is being handled (15.1), or
— when unexpected throws an exception which is not allowed by the previously violated exceptionspecification, and std::bad_exception is not included in that exception-specification (15.5.2), or
— when the implementation’s default unexpected_handler is called (18.6.2.2)
In such cases,
void terminate();
is called (18.6.3).
 In the situation where no matching handler is found, it is implementation-defined whether or not the stack is unwound before terminate() is called. In all other situations, the stack shall not be unwound before terminate() is called. An implementation is not permitted to finish stack unwinding prematurely based on a determination that the unwind process will eventually cause a call to terminate().


.....

18.6.3.1/3
Default behavior: The implementation’s default terminate_handler calls abort().


Цитата(akizelokro @  29.10.2007,  16:51 Найти цитируемый пост)
Я еще учебник не одолел, так что мне стандарт штудировать еще рано.

Стандарт штудировать не обязательно... IIRC об этом же подробно написано у Мейрса.


Цитата(akizelokro @  29.10.2007,  16:51 Найти цитируемый пост)
А учитывая количество литературы, в которой я закопался, и то, что мою работу с меня никто не снимал, просто нет времени.

И тем не менее ты находишь время, получив ответ, проигнорировать его и пофантазировать что будет "если бы, да кабы"...

Добавлено через 1 минуту и 39 секунд
Цитата(Alexeis @  29.10.2007,  16:54 Найти цитируемый пост)
archimed7592, я не вижу чтобы строчка 
Цитата(archimed7592 @  29.10.2007,  16:42 Найти цитируемый пост)
 std::cout << e << std::endl;

Была в защищенной секции...

Какая разница, если до неё выполнение даже не дойдёт smile.

Добавлено через 3 минуты и 32 секунды
Цитата(Alexeis @  29.10.2007,  16:54 Найти цитируемый пост)
вот тогда что произойдет?

Код

archimed7592@PC ~/testlabs/g++
$ cat ./main.cpp
#include <ostream>
#include <iostream>
struct A
{
     ~A()
     {
         throw 1;
     }
};
int main()
{
     try
     {
         A a;
         throw 2;
     }
     catch(int e)
     {
       try
       {
         std::cout << e << std::endl;
       }
       catch(...)
       {
         std::cout << "..." << std::endl;
       }
     }
}

archimed7592@PC ~/testlabs/g++
$ g++ ./main.cpp

archimed7592@PC ~/testlabs/g++
$ ./a.exe

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

archimed7592@PC ~/testlabs/g++
$


Добавлено через 4 минуты и 34 секунды
А что ещё может произойти, если ошибка произошла в самом механизме обработки ошибок? 0_о

В Дельфи такого понятия нет, ибо там нет понятия "автоматический объект", как и нет RAII.

Добавлено через 6 минут и 3 секунды
Цитата(Lazin @  29.10.2007,  17:00 Найти цитируемый пост)
Возможно Alexeis, имел ввиду следующее:

Ну с этим всё понятно - а что, в Delphi вложенные блоки обрабатываются как-то иначе?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
archimed7592
Дата 29.10.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Вообще говоря, выполнение в блоке catch отличается от выполнения вне блока catch только тем, что внутри catch поведение инструкции throw; имеет предсказуемый результат.
Даже в таких, немного извращённых, случаях:
Код

#include <istream>
#include <ostream>
#include <iostream>

void handleException()
{
    try
    {
        throw;
    }
    catch(int e)
    {
        std::cout << "int: " << e << std::endl;
    }
    catch(double e)
    {
        std::cout << "double: " << e << std::endl;
    }
    catch(...)
    {
        std::cout << "unknown(maybe bool :))" << std::endl;
    }
}

int main()
{
    while(true)
    {
        try
        {
            char c;
            std::cin >> c;
            switch(c)
            {
            case 'i':
            case 'I':
                throw 1;
            case 'd':
            case 'D':
                throw 1.;
            case 'q':
            case 'Q':
                return 0;
            default:
                throw false;
            }
        }
        catch(...)
        {
            handleException();
        }
    }
}


Код

archimed7592@PC ~/testlabs/g++
$ g++ ./main.cpp

archimed7592@PC ~/testlabs/g++
$ ./a.exe
q

archimed7592@PC ~/testlabs/g++
$ ./a.exe
i
int: 1
i
int: 1
d
double: 1
D
double: 1
g
unknown(maybe bool :))
q

archimed7592@PC ~/testlabs/g++
$



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 29.10.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(archimed7592 @  29.10.2007,  17:03 Найти цитируемый пост)
Ну с этим всё понятно - а что, в Delphi вложенные блоки обрабатываются как-то иначе?

  Да я с исключениями знаком поверхностно. Примерно знаю как их юзать и все, как оно там внутри не вникал. Однако я ничего не слышал про то что внутри блока обработки нельзя вызывать другое исключение...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 29.10.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  29.10.2007,  17:49 Найти цитируемый пост)
Однако я ничего не слышал про то что внутри блока обработки нельзя вызывать другое исключение...

Внутри блока можно smile.

Когда генерируется исключение, все автоматические объекты из данной области видимости уничтожаются(называются отмоткой стека). Под уничтожением понимается отработка деструкторов. Это происходит ДО входа в блок catch. Т.о., если во время этой отмотки стека из одного из деструкторов вывалится исключение(наружу), то сработает terminate, поведение которого по умолчанию - abort(abnormal termination).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 29.10.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(archimed7592 @  29.10.2007,  20:27 Найти цитируемый пост)
Когда генерируется исключение, все автоматические объекты из данной области видимости уничтожаются(называются отмоткой стека).

 Т.е. уничтожаются все статические объекты объявленные в этом блоке (в блоке try)?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 29.10.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alexeis @  29.10.2007,  21:50 Найти цитируемый пост)
 Т.е. уничтожаются все статические объекты объявленные в этом блоке (в блоке try)? 

Не статические, а автоматические smile. У статических объектов деструкторы отрабатывают по её завершению(грубо говоря, по выходу из main).
И не только те, что объявлены в этом блоке, но во всех других блоках видимости, которые покидает исключение по пути к своему обработчику.
Код

#include <istream>
#include <ostream>
#include <iostream>

struct Logger
{
    explicit Logger(int value)
     : value(value)
    {
        std::cout << "Logger(" << value << ")" << std::endl;
    }
    
    ~Logger()
    {
        std::cout << "~Logger(" << value << ")" << std::endl;
    }
private:
    int value;
};
        
int main()
{
    Logger log1(1), log2(2);
    try
    {
        Logger log3(3), log4(4);
        try
        {
            Logger log5(5);
            throw 1;
        }
        catch(int e)
        {
            std::cout << "catch " << e << std::endl;
        }
        try
        {
            Logger log6(6);
        }
        catch(int e)
        {
            std::cout << "catch " << e << std::endl;
        }
        try
        {
            Logger log7(7);
            throw 2.0;
        }
        catch(int e)
        {
            std::cout << "catch int " << e << std::endl;
        }
    }
    catch(double e)
    {
        std::cout << "catch double " << e << std::endl;
    }
    Logger log8(8), log9(9);
    
}

Код

archimed7592@PC ~/testlabs/g++
$ g++ ./main.cpp

archimed7592@PC ~/testlabs/g++
$ ./a.exe
Logger(1)
Logger(2)
Logger(3)
Logger(4)
Logger(5)
~Logger(5)
catch 1
Logger(6)
~Logger(6)
Logger(7)
~Logger(7)
~Logger(4)
~Logger(3)
catch double 2
Logger(8)
Logger(9)
~Logger(9)
~Logger(8)
~Logger(2)
~Logger(1)

archimed7592@PC ~/testlabs/g++
$

Обрати внимание, что уничтожается не только 7, но 4, 3, ибо их область видимости тоже заканчивается во время проброса исключения и, соответственно, отмотки стека.

Добавлено через 2 минуты и 19 секунд
На принципе отмотки стека и основан RAII - это замена вашему finally(вместо него деструктор)... Только вот finally можно забыть написать, а деструктор автоматического объекта вызовется автоматически по выходу из области видимости smile. Будь то исключение, обычной ход выполнения, goto или ещё что-нибудь.

Это сообщение отредактировал(а) archimed7592 - 29.10.2007, 22:07


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alexeis
Дата 29.10.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(archimed7592 @  29.10.2007,  22:07 Найти цитируемый пост)
Обрати внимание, что уничтожается не только 7, но 4, 3, ибо их область видимости тоже заканчивается во время проброса исключения и, соответственно, отмотки стека.

  Ну это и так очевидно, ведь происходит выход из блока. Все что создано в блоке уничтожается по выходу из него вне зависимости от того каким образом из него вышли. Странно если бы такого не было...


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 29.10.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



В делфях все не так работает. Если возникает исключение, то обработка происходит внутри текущего блока. Он как бы изолирован и не видит внешнего блока. Только если исключение будет в самой обработке, тогда вызовется внешний обработчик. Для блока Try может быть только 1 except или 1 finally (но не одновременно)

Пример
Код

var
  c1, c2 : integer;
begin
  try
    c1 := 7;
    c2 := 0;
    try
      c1 := c1 div c2;
      c1 := 7;
    finally
      raise EAccessViolation.Create('абшибка');
      showmessage('выполнился finally');
    end;

  except
   // showmessage('выполнился except');
    on EAccessViolation do showmessage('выполнился EAccessViolation');
    on EDivByZero       do showmessage('выполнился EDivByZero');
  end;


Сначала сработает finally, но сообщение 'выполнился finally' не выйдет, так как сгенериться AV и только в этом случае выполниться except.
Обработка разных типов исключений определяется в рамках одного блока, т.е. в данном случае 
"on EDivByZero       do showmessage('выполнился EDivByZero');" никогда не выполниться потому, что исключение EDivByZero считается уже отработанным в блоке finally.

  Т.е. схема более простая и прозрачная. Ну про статические объекты говорить тут нечего, так как их попросту нет, да и вообще в блоках нельзя объявлять переменные, потому они будут существовать до конца работы функции.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
akizelokro
Дата 31.10.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

IIRC об этом же подробно написано у Мейрса.


За ответ спасибо. За ссылку на Мейерса тоже, но чтить его буду после одоления текущего учебника.

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

Вот и ответ автору темы на его поставленные вопросы (большинство из них).


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 31.10.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  31.10.2007,  10:48 Найти цитируемый пост)
, даже если казалось бы делаю все правильно.

А что ты понимаешь под словами "делаю всё правильно"?
Грубо говоря, зачем выпускать исключение из деструктора можешь объяснить? Ты же потом уже не сможешь уничтожить объект "до конца".


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 31.10.2007, 11:23 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



я говорю про то, что если при раскрутке стека уничтожается локальный объект с деструктором вида

Код

~Something()
{
  try
  {
    ....
  }
  catch(const SomeException& se)
  {
    ..
  }
}


или с деструктором в функциональном виде, то даже несмотря на наличие обработки исключения, на которую я надеюсь, программа все равно отрубится. Согласно стандарту. Для динамических объектов это не так.



Это сообщение отредактировал(а) akizelokro - 31.10.2007, 11:36


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
UnrealMan
Дата 31.10.2007, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(akizelokro @  31.10.2007,  11:48 Найти цитируемый пост)
Иными словами, если во время раскрутки стека возбуждается второе исключение, то программа падает, а я теряю контроль над своим кодом, даже если казалось бы делаю все правильно. Неприятно.

Неправда. В C++ одновременно может быть хоть сто необработанных исключений. Если их вовремя ловить, то программа будет вполне себе благополучно работать.
PM MAIL   Вверх
bsa
Дата 31.10.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(akizelokro @ 31.10.2007,  11:23)
я говорю про то, что если при раскрутке стека уничтожается локальный объект с деструктором вида

Код

~Something()
{
  try
  {
    ....
  }
  catch(const SomeException& se)
  {
    ..
  }
}


или с деструктором в функциональном виде, то даже несмотря на наличие обработки исключения, на которую я надеюсь, программа все равно отрубится. Согласно стандарту. Для динамических объектов это не так.

В данном случае код вполне легальный.
Программа убивается через std::terminate(), когда исключение выходит за пределы деструктора!!!!
т.е.
Код
#include <iostream>
struct A
{
     ~A() { 
          try {
               throw 1;
          } catch(int) {
               std::cout << "A" << std::endl;
          }
     }
};
struct B
{
     ~B() { 
          try {
               throw "";
          } catch(int) {
               std::cout << "B" << std::endl;
          }
     }
};

main()
{
        B b;
        A a;
}
Результат работы будет следующий:
Код
$ ./a.out 
A
terminate called after throwing an instance of 'char const*'
Аварийный останов


Добавлено через 2 минуты и 26 секунд
В данном примере, в деструкторе класса B было кинуто исключения типа const char *, а catch стоял только на исключения типа int. В итоге, исключение вышло из пределов деструктора, а так как деструктор не закончил выполнение, была вызвана std::terminate().
PM   Вверх
akizelokro
Дата 31.10.2007, 12:59 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код правильный, но не о том. С самого начала рассматривается ситуация, когда возбуждено исключение, назовем его первичным. Происходит раскрутка стека, и в ходе этой раскрутки стека идет второе исключение при уничтожении локального объекта (в деструкторе). Стандарт гласит (если мой перевод верен), что в этом случае программа вызовет функцию terminate (до или после обработки вторичного исключения - уже не так важно). И это будет даже когда логика деструктора не подразумевает прекращения дальнейшего выполнения программы и возникшее в деструкторе исключение в том же самом деструкторе должно без лишнего шума обработаться. В твоем же коде идет обычная обработка двух невложенных исключений.

Это сообщение отредактировал(а) akizelokro - 31.10.2007, 13:02


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
akizelokro
Дата 31.10.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Кстати, такой код 

Код

#include <ostream>
#include <iostream>
struct A
{
     ~A()
     {
         try
         {
            throw 1;
         }
         catch(int e)
         {
             std::cout << e << std::endl;
         }
     }
};

int main()
{
     try
     {
         A a;
         throw 2;
     }
     catch(int e)
     {
         std::cout << e << std::endl;
     }
     std::cout << "Программирование - работа с ошибками:-)" << std::endl;
     return 0;
}


в МSVC++ 6 добрался до благополучного завершения. Хмык, нужно садиться за английский.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Fazil6
Дата 31.10.2007, 14:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(akizelokro @  31.10.2007,  13:29 Найти цитируемый пост)
в МSVC++ 6 добрался до благополучного завершения. Хмык, нужно садиться за английский.

потому, что все исключения обработаны коректно.

Цитата(akizelokro @  31.10.2007,  12:59 Найти цитируемый пост)
Происходит раскрутка стека, и в ходе этой раскрутки стека идет второе исключение при уничтожении локального объекта (в деструкторе). Стандарт гласит (если мой перевод верен), что в этом случае программа вызовет функцию terminate (до или после обработки вторичного исключения - уже не так важно). И это будет даже когда логика деструктора не подразумевает прекращения дальнейшего выполнения программы и возникшее в деструкторе исключение в том же самом деструкторе должно без лишнего шума обработаться. В твоем же коде идет обычная обработка двух невложенных исключений.

нет. При раскрутке стека и уничтожении обектов вполне допускаются исключения. 
terminate вызовется только если у тебя получится на руках больше одного необработаного исключения, т.е. если какие-то иключения небудут вовремя обработаны.

Код

~A()
     {
         try
         {
            throw 1;
         }
         catch(int e)
         {
             std::cout << e << std::endl;
         }
     }
 тут ты обрабатываешь исключение внутри деструктора и наружу оно не выходит, а если его не обработать, то после первого исключения и раскрутки стека получишь здесь
Код

 try
     {
         A a;
         throw 2;
     }
 catch(int e)
     {
         std::cout << e << std::endl;
     }

сразу 2 исключения, а это уже папандос...


PM MAIL   Вверх
archimed7592
Дата 31.10.2007, 14:35 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  31.10.2007,  13:29 Найти цитируемый пост)
Хмык, нужно садиться за английский. 

Думаю стоит начать с русского: я не один раз упомянул о том, что для terminate исключение должно вывалиться из деструктора(наружу). Фантазируй поменьше и читай повнимательней.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 31.10.2007, 15:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

я не один раз упомянул о том, что для terminate исключение должно вывалиться из деструктора(наружу).

Цитата

when the destruction of an object during stack unwinding (15.2) exits using an exception

C учетом того, что эксперты иной раз у нас да лопухнутся (ничего личного), я все-таки предпочитаю верить более надежным источникам. Если "exits using an exception" означает "вывалиться из деструктора(наружу)", то приношу свои извинения за назойливость.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 31.10.2007, 15:35 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  31.10.2007,  15:30 Найти цитируемый пост)
Если "exits using an exception" означает "вывалиться из деструктора(наружу)", то приношу свои извинения за назойливость.

Ок. Как можно выйти из ф-ции(коей деструктор тоже является)? Либо return, либо исключение. Здесь упомянут только второй вариант(выходит из деструктора из-за [неперехваченного] исключения).
Извинения принимаются, но будь любезен быть немного повнимательней, а если не знаешь английский, то верь наслово русскоговорящим "экспертам, которые лопухаются".


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 31.10.2007, 18:41 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(akizelokro @ 31.10.2007,  15:30)
эксперты иной раз у нас да лопухнутся 

Все одновременно вряд ли. Обычно, один глупость сморозит другие поправят. А когда все в один голос говорят одно и тоже, но разными словами, то не верить не стоит.  smile 
PM   Вверх
akizelokro
Дата 1.11.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Иными словами, у стандарта совсем не дружелюбный интерфейс). "unhandled" в упомянутой строке нет, а в предыдущей есть.

Цитата

Извинения принимаются, но будь любезен быть немного повнимательней, а если не знаешь английский, то верь наслово русскоговорящим "экспертам, которые лопухаются". 


А сам виноват. Отсылаешь меня к стандарту, когда я говорю, что мне еще рано за него садиться. В неправильном переводе меня не поправил. Пример дал не тот. Вообщем, пока я сам не накорябал соответствующий пример и не прогнал его на двух разных компилерах и таким образом получил ответ на свои вопросы, только тогда эксперты проснулись. Все равно спасибо, но я лишний раз убедился, что в сложных (для меня) вопросах нужно брать самому и компиляться.

Это сообщение отредактировал(а) akizelokro - 1.11.2007, 08:15


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 1.11.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  1.11.2007,  08:14 Найти цитируемый пост)
Иными словами, у стандарта совсем не дружелюбный интерфейс). "unhandled" в упомянутой строке нет, а в предыдущей есть.

Извините пожалста, а как можно выйти из ф-ции из-за обработанного исключения?

Цитата(akizelokro @  1.11.2007,  08:14 Найти цитируемый пост)
А сам виноват.

Прошу у тебя прощения, если ты действительно считаешь, что я в чём-то виноват.

Цитата(akizelokro @  1.11.2007,  08:14 Найти цитируемый пост)
Отсылаешь меня к стандарту, когда я говорю, что мне еще рано за него садиться.

Я перед этим черным по белому написал об этом, просто упомянув, что это указано в стандарте.

Цитата(akizelokro @  1.11.2007,  08:14 Найти цитируемый пост)
Пример дал не тот.

Да что ты говоришь? А это ты типа не заметил...

Цитата(akizelokro @  1.11.2007,  08:14 Найти цитируемый пост)
Вообщем, пока я сам не накорябал соответствующий пример и не прогнал его на двух разных компилерах и таким образом получил ответ на свои вопросы, только тогда эксперты проснулись.

Бывают же такие неблагодарные создания... Вот если я чего-то не знаю - да я сто раз спасибо скажу, если меня чему-то научат(и буду совершенно искреннен). А ты всё выставишь так, будто тут все тебе обязаны и вообще, ты тут самый умный, просто на время "забыл" о чём идёт речь. Твоё конечно дело, но, блин, начинает раздражать(не первый топик в которым ты себя так ведёшь).



Цитата(akizelokro @  1.11.2007,  08:14 Найти цитируемый пост)
Все равно спасибо, но я лишний раз убедился, что в сложных (для меня) вопросах нужно брать самому и компиляться.

Угу. Только не компиляться, а разбираться.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 1.11.2007, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(akizelokro @  1.11.2007,  08:14 Найти цитируемый пост)
Все равно спасибо, но я лишний раз убедился, что в сложных (для меня) вопросах нужно брать самому и компиляться.

компилятор - не панацея
т. е результат он даст, но где гарантия, что он правильный?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
akizelokro
Дата 1.11.2007, 10:05 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Не надо мне мозги пудрить. Я тебе черным по белому писал, что исключение будет обрабатываться внутри деструктора. К тому же ты, как я смотрю, выбираешь довольно простые и удобные для себя аргументы (что имеет право на существование, но сомнительно для меня, - я даже простецкие, но принципиальные по логике ошибки не редактирую и оставляю, чтобы не чваниться,- хотя они мне и становятся видны через 5 минут после отправки мессаджа). Небольшое усложнение кода

Код

#include <iostream>
#include <string>

class Base
{
private:
    int * ptr;
public:
    Base() { ptr = new int[5000]; };
    ~Base()
    {
        std::cout << "Inline base destructor" << std::endl;
        delete[] ptr;
    }
};

class A: public Base
{
public:
     ~A()     
    try
     {
            throw 1;
     }
     catch(int e)
     {
             std::cout << e << std::endl;
     }
};

int main()
{
     try
     {
         A a;

         throw 2;
     }
     catch(int e)
     {
         std::cout << e << std::endl;
     }
     std::cout << _T("Программирование - работа с ошибками:-)") << std::endl;
     std::string str;
     std::cin >> str; 
     return 0;
}


, где деструктор находится в функциональном блоке try-catch. Этот код не компилится под MSVC++ 6 и BDS2006. мне удалось прокомпилить его под MSVS 2008 Beta2. Здесь действительно программа выходит из деструктора по исключению, даже несмотря на то, что исключение обрабатывается в деструкторе. В предыдущих твоих примерах программа могла выходить из деструктора только при необработанном исключении (есть разница). Сейчас terminate() вызывается. Здесь возможны два варианта:
-Beta версия и есть Beta версия
-генерировать исключения в деструкторах не рекомендуется (но это вообще другая песня).

Пока что я считаю исключения одним из самых муторных разделов C++ (моя субъективная оценка). К теме экспертов и их уровня возвращаться не хочу. Просто просьба прокомпилить код под другим компилером и ткнуть мне в нос результаты.

Это сообщение отредактировал(а) akizelokro - 1.11.2007, 10:12


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Fazil6
Дата 1.11.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(akizelokro @  1.11.2007,  10:05 Найти цитируемый пост)
Этот код не компилится под MSVC++ 6 и BDS2006.

хм...
А разве такой синтаксис допустим в С++ ???  smile 

Цитата(akizelokro @  1.11.2007,  10:05 Найти цитируемый пост)
-генерировать исключения в деструкторах не рекомендуется (но это вообще другая песня).

нет ничего необычного в исключениях в деструкторе. можно их там и генерить и использовать. Выпускать их из деструктора нерекомендуется

Добавлено через 1 минуту и 11 секунд
Цитата(akizelokro @  1.11.2007,  10:05 Найти цитируемый пост)
Просто просьба прокомпилить код под другим компилером и ткнуть мне в нос результаты.

какие результаты?
исправь ошибку синтаксиса и все нормально работает в твоем примере
PM MAIL   Вверх
Daevaorn
Дата 1.11.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Fazil6 @  1.11.2007,  11:37 Найти цитируемый пост)
хм...
А разве такой синтаксис допустим в С++ ???  smile 

да
PM MAIL WWW   Вверх
Daevaorn
Дата 1.11.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(akizelokro @  1.11.2007,  11:05 Найти цитируемый пост)
где деструктор находится в функциональном блоке try-catch. 

читаем внимательно стандарт
Цитата(IS ISO/IEC 14882)

-16- The exception being handled is rethrownif control reaches the end of a handler of the function-try-block of a constructor or destructor . Otherwise, a function returns when control reaches the end of a handler for the function-try-block (stmt.return). Flowing off the end of a function-try-block is equivalent to a return with no value; this results in undefined behavior in a value-returning function (stmt.return).

Цитата(akizelokro @  1.11.2007,  11:05 Найти цитируемый пост)
Не надо мне мозги пудрить. 

а ты нам не пудри!
Цитата(akizelokro @  1.11.2007,  11:05 Найти цитируемый пост)
К тому же ты, как я смотрю, выбираешь довольно простые и удобные для себя аргументы

весь в тебя

PS: akizelokro,совет остается в силе!

PM MAIL WWW   Вверх
UnrealMan
Дата 1.11.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(akizelokro @  1.11.2007,  11:05 Найти цитируемый пост)
Здесь действительно программа выходит из деструктора по исключению, даже несмотря на то, что исключение обрабатывается в деструкторе. 

Вот такие два варианта кода

Код
~T()
try
{
    ....
}
catch (...)
{
    ....
}


Код
~T()
{
    try
    {
        ....
    }
    catch (...)
    {
        ....
    }
}

это не одно и то же.
В первом случае function-try-block, во втором - обычный try-block. И применительно к деструктору поведение получается разным.

Это сообщение отредактировал(а) UnrealMan - 1.11.2007, 11:35
PM MAIL   Вверх
akizelokro
Дата 1.11.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

В первом случае function-try-block, во втором - обычный try-block. И в данном случае поведение получается разным.

Угу. В твоем первом случае согласно цитате из стандарта, приведенной комодератором (если я опять "неправильно" перевел smile ), происходит выход из деструктора. Во втором случае выхода из функции в результате обработки не происходит (фантазирую дальше). Управление бы перешло на следующую инструкцию за блоком. Ну, с этим я уже разобрался. Просто вопросы-ответы переросли в стычку, а она завертелась вокруг фразы из стандарта

Цитата

— when the destruction of an object during stack unwinding (15.2) exits using an exception

в которой не указывается явно "unhandled", но есть "exits".
Сорри, мне просто нужно сдавать тест, а на предварилке я по исключениям очень крупно влетел. Вот и пытаюсь хоть таким образом переварить кашу из исключений, которая заварилась у меня в голове  smile . Если бы я занимался этим втихаря, то у меня могло бы и не получиться сделать это оперативно. А тут, "напрягая" наших экспертов и используя для допинга спортивный азарт, мне удалось это сделать довольно быстро. 

Цитата

весь в тебя
PS: akizelokro,совет остается в силе!

Во-первых, не совет, а официальное предупреждение от комодератора в личной переписке и в сообщении с очень "деликатно оформленной" темой. Я помню  smile 
Жду, когда замодерируют. Жаловаться не буду.

Это сообщение отредактировал(а) akizelokro - 1.11.2007, 11:57


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
archimed7592
Дата 2.11.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(akizelokro @  1.11.2007,  10:05 Найти цитируемый пост)
Я тебе черным по белому писал, что исключение будет обрабатываться внутри деструктора.

А за базар то придётся ответить smile.
Ткни пальцем, где ты об этом написал.

Цитата(akizelokro @  1.11.2007,  10:05 Найти цитируемый пост)
я даже простецкие, но принципиальные по логике ошибки не редактирую и оставляю, чтобы не чваниться,- хотя они мне и становятся видны через 5 минут после отправки мессаджа

Цитата(akizelokro @  29.10.2007,  16:23 Найти цитируемый пост)
Это сообщение отредактировал(а) akizelokro - 29.10.2007, 16:30 
Цитата(akizelokro @  31.10.2007,  11:23 Найти цитируемый пост)
Это сообщение отредактировал(а) akizelokro - 31.10.2007, 11:36 
Цитата(akizelokro @  31.10.2007,  12:59 Найти цитируемый пост)
Это сообщение отредактировал(а) akizelokro - 31.10.2007, 13:02 
Цитата(akizelokro @  1.11.2007,  08:14 Найти цитируемый пост)
Это сообщение отредактировал(а) akizelokro - 1.11.2007, 08:15 
Цитата(akizelokro @  1.11.2007,  10:05 Найти цитируемый пост)
Это сообщение отредактировал(а) akizelokro - 1.11.2007, 10:12 
Цитата(akizelokro @  1.11.2007,  11:48 Найти цитируемый пост)
Это сообщение отредактировал(а) akizelokro - 1.11.2007, 11:57 

smile

Цитата(akizelokro @  1.11.2007,  11:48 Найти цитируемый пост)
в которой не указывается явно "unhandled", но есть "exits".

Ещё раз для тех кто в танке: как можно выйти из ф-ции, используя перехваченное исключение(не return)?
Приведёшь пример, получишь миллион плюсов в репу, лично моё наиглубочайшее уважение, а также, сможешь рассказывать внукам "я нашёл опечатку в стандарте и её исправили".
Это очень важный(в частности для твоего понимания "самого муторного раздела С++") вопрос в этом споре. Как только ты на него ответишь, так сразу у тебя отпадут все, задаваемые тобой в этом топике вопросы.

Цитата(akizelokro @  1.11.2007,  11:48 Найти цитируемый пост)
Сорри, мне просто нужно сдавать тест, а на предварилке я по исключениям очень крупно влетел. Вот и пытаюсь хоть таким образом переварить кашу из исключений, которая заварилась у меня в голове  smile . Если бы я занимался этим втихаря, то у меня могло бы и не получиться сделать это оперативно. А тут, "напрягая" наших экспертов и используя для допинга спортивный азарт, мне удалось это сделать довольно быстро. 

Ты считаешь нормальным вызывать негативное мнение о тебе у других участников форума только ради того, чтобы сдать какой-то там тест?
А ну ка, эксперты, поднапряглись и быстро всё ему объяснили - его величеству нужно тест сдавать! smile

DaevaornMAKCim, давно ли это(и зачем) вас понизили до комодов? 0_о


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 2.11.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



archimed7592
если интересно, в ЛС


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lazin
Дата 2.11.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(archimed7592 @  2.11.2007,  00:39 Найти цитируемый пост)
как можно выйти из ф-ции, используя перехваченное исключение(не return)?

разве не так?
Цитата(UnrealMan @  1.11.2007,  11:20 Найти цитируемый пост)
Код

~T()
try
{
    ....
}
catch (...)
{
    ....
}

если в try блоке происходит исключение, оно перехватывается блоком catch, и затем происходит выход из деструктора, но не через return.
PM MAIL Skype GTalk   Вверх
Daevaorn
Дата 2.11.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Lazin @  2.11.2007,  11:19 Найти цитируемый пост)

если в try блоке происходит исключение, оно перехватывается блоком catch, и затем происходит выход из деструктора, но не через return. 

оно rethrown

PM MAIL WWW   Вверх
archimed7592
Дата 2.11.2007, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Lazin @  2.11.2007,  10:19 Найти цитируемый пост)
но не через return.

А через throw; . Т.е. появляется другое исключение, которое уже не перехвачено.

Добавлено через 54 секунды
Это точно так же, как в случае, если ты в конце деструктора не написал return; - оно "напишется" за тебя.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2855 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.