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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поговорим про исключения 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1022 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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