Re[16]: эксепшины vs коды возврата
От: Vladik Россия  
Дата: 13.09.02 13:31
Оценка:
Здравствуйте Sergey, Вы писали:

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


[...]

И "это" лучше if/else??? Вопросов больше не имею (с)
Как все запущенно...
Re[17]: эксепшины vs коды возврата
От: Sergey Россия  
Дата: 13.09.02 13:44
Оценка:
Здравствуйте Vladik, Вы писали:

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


Там вкралась ошибка: естественно, должно быть не

closer(*this);


а
closer somename(*this);


V>И "это" лучше if/else??? Вопросов больше не имею (с)


"Это" гораздо лучше if/else по одной простой причине — какая бы у тебя сложная функция не была, сколько бы раз ты внутри нее не написал return, ты не сумеешь забыть закрыть файл — об этом позаботиться компилятор. Впрочем, с файлами обычно таких проблем не возникает. А вообще это в C++ стандартная техника освобождения ресурса (захват, правда, обычно делают в конструкторе).
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[18]: эксепшины vs коды возврата
От: Vladik Россия  
Дата: 13.09.02 14:05
Оценка:
Здравствуйте Sergey, Вы писали:

S>Там вкралась ошибка: естественно, должно быть не


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

[...]
S>"Это" гораздо лучше if/else по одной простой причине — какая бы у тебя сложная функция не была, сколько бы раз ты внутри нее не написал return, ты не сумеешь забыть закрыть файл — об этом позаботиться компилятор.

Если получается настолько сложная функция, что начинают иметь смысл "такие" вещи — то имеет смысл задуматься над декомпозицией.

S>Впрочем, с файлами обычно таких проблем не возникает. А вообще это в C++ стандартная техника освобождения ресурса (захват, правда, обычно делают в конструкторе).


Не надо путать ресурсы, для которых всегда имеет смысл написать враппер, и "общий" код, который должен быть выполнен в случае эксепшина.
Как все запущенно...
Re[11]: эксепшины vs коды возврата
От: Bell Россия  
Дата: 13.09.02 14:51
Оценка:
Здравствуйте Vladik, Вы писали:


V>Я тоже не вчера родился. Мой опыт говорит, что исключения в С++ ничем кроме геморроя с try/catch и вылетом неизвестно откуда неизвестно куда не оборачиваются. За редким исключением.


При всем уважении, твой опыт — это только твой опыт.
Мой опыт говорит, что при нормальном проектировании исключения весьма полезны (заметь я не говорю о том, что их нужно использовать всегда)

SZ>>Нету вредности исключений пробрасываемых из библиотек, есть вредность плохо написанных библиотек, в которых применение исключений приводит к кошмару.


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


Я надеюсь, что с тобой это когда-нибудь случиться

SZ>>И на последок, я всегда был против категоричного утверждения, что какие-то конструкции хуже других. Все надо к месту применять. Существует много ситуаций, когда одна или другая конструкция лучше подходит, ну так и используй ее.


V>Именно так я и делаю. Я не против исключений вообще, я против маразмов типа:


V>

V>
V>bool success=true;
V>    try
V>    {
V>        f();
V>    }
V>    catch(exception)
V>    {
V>        success=false;
V>    }

V>    if (success)
V>    {
V>    ...
V>    }
V>    else
V>    {
V>    ...
V>    }
V>


V>которые неизбежно получаются при широком использовании эксепшинов, особенно в левосторонних библиотеках.

Это маразм, но вызван он не использование исключений вообще, а кривостью проектирования.
Любите книгу — источник знаний (с) М.Горький
Re[13]: эксепшины vs коды возврата
От: MaximE Великобритания  
Дата: 13.09.02 21:16
Оценка:
Здравствуйте Vladik, Вы писали:

Мое мнение, что все-таки ключевое в исключениях это механизм раскрутки стека, то что ставит их на уровень выше кодов возврата при использовании "выделение есть инициализация".

V>Кстати, опять возвращаясь к моему первому письму — исключения в конструкторах в С++ как-бы есть, но работают настолько криво, что все-равно лучше их там не использовать.


Что значит криво? Приведи пример. Исключения в конструкторах честно вызывают деструкторы всех созданных к моменту исключения членов и базовых классов.
Re[3]: эксепшины vs коды возврата
От: Patalog Россия  
Дата: 14.09.02 07:05
Оценка:
Здравствуйте Sergey Zhulin, Вы писали:

P>>В доконку хотел бы подкинуть пост из недр "знаменитого" топика "Выйти из двух циклов сразу" http://www.rsdn.ru/forum/Message.aspx?mid=61162&only=1
Автор: m.a.g.
Дата: 06.06.02

P>>Как насчет данного случая? В плане применябельности эксепшенов.

SZ>Я встречал и более корявый код:


Ну, насчет корявости ты загнул, имхо. Мне понравилось. Правда в _данном_ случае это не оправдано.
Почетный кавалер ордена Совка.
Re[14]: эксепшины vs коды возврата
От: Vladik Россия  
Дата: 16.09.02 07:01
Оценка:
Здравствуйте MaximE, Вы писали:

ME>Мое мнение, что все-таки ключевое в исключениях это механизм раскрутки стека, то что ставит их на уровень выше кодов возврата при использовании "выделение есть инициализация".


Это не всегда удобно. Пример приводился.

V>>Кстати, опять возвращаясь к моему первому письму — исключения в конструкторах в С++ как-бы есть, но работают настолько криво, что все-равно лучше их там не использовать.


ME>Что значит криво? Приведи пример. Исключения в конструкторах честно вызывают деструкторы всех созданных к моменту исключения членов и базовых классов.


Я не пользуюсь исключениями в конструкторах Мне достаточно почитать высказывания людей, с этим сталкивавшихся. В частности, было что-то типа: "не видел еще ни одного компилятора, у которого бы не было проблем с исключениями в конструкторе".
Как все запущенно...
Re[13]: эксепшины vs коды возврата
От: Sergey Zhulin  
Дата: 16.09.02 07:07
Оценка:
Здравствуйте Vladik, Вы писали:

V>Кстати, опять возвращаясь к моему первому письму — исключения в конструкторах в С++ как-бы есть, но работают настолько криво, что все-равно лучше их там не использовать.


Что значит работают криво? Не раскручивается стек? Не вызываются деструкторы при раскрутке стека?

SZ>>так вот, получается, что для обеспечения инварианта каждый метод класса должен содержать проверку индикаторов.


V>Это вполне нормально.


Кому как, для меня это не нормально. Инвариант, это значит, что объект не должен существовать в не валидном состоянии, он даже не должен быть сконструирован, это исключительная ситуация.

SZ>>Инициализацию невозможно поместить в конструктор, так как нету кода возврата. Это простейший случай, для инициализации объекта, но если после исполнения какого-нибудь метода инвариант нарушен, то с таким объектом можно продолжать работать не зная о том, что он более не валиден, и никто об этом не просигналит, если забыли проверить возвращенное значение.


V>Отлавливается сразу при отладке, как показано выше.


Хочу предложить уважаемым участникам форума в этой ветке вывести плюсы и минусы каждого подхода вместо бесполезного спора. В результате получится что-то типа hints для конкретных ситуаций.

С уважением,
Сергей Жулин.
Re[14]: эксепшины vs коды возврата
От: Vladik Россия  
Дата: 16.09.02 07:19
Оценка:
Здравствуйте Sergey Zhulin, Вы писали:

SZ>Кому как, для меня это не нормально. Инвариант, это значит, что объект не должен существовать в не валидном состоянии, он даже не должен быть сконструирован, это исключительная ситуация.


Тогда можно для конструирования использовать Create(), а конструкторы засунуть в private.

[...]
SZ>Хочу предложить уважаемым участникам форума в этой ветке вывести плюсы и минусы каждого подхода вместо бесполезного спора. В результате получится что-то типа hints для конкретных ситуаций.

Минусы по-пунктно уже были изложены в самом первом моем письме. Пусть плюсы кто-нибудь другой опишет.
Как все запущенно...
Re[15]: эксепшины vs коды возврата
От: Sergey Zhulin  
Дата: 16.09.02 07:22
Оценка:
Здравствуйте Vladik, Вы писали:

V>Здравствуйте MaximE, Вы писали:


V>Я не пользуюсь исключениями в конструкторах Мне достаточно почитать высказывания людей, с этим сталкивавшихся. В частности, было что-то типа: "не видел еще ни одного компилятора, у которого бы не было проблем с исключениями в конструкторе".


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

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

Сергей.
Re[16]: эксепшины vs коды возврата
От: Vladik Россия  
Дата: 16.09.02 07:54
Оценка:
Здравствуйте Sergey Zhulin, Вы писали:

SZ>Это не довод,


Да, это не довод, но учитывать стоит.

SZ>давай конкретные описания проблем. Зачем организовано это обсуждение? Ты хочешь всех убедить в бесполезности исключений или просто поболтать?


Я просто высказал свое мнение. Конкретная проблема — неотловленный эксепшин в деструкторе приводит к "undefined behaviour".
Как все запущенно...
Re[17]: эксепшины vs коды возврата
От: Sergey Zhulin  
Дата: 16.09.02 08:03
Оценка:
Здравствуйте Vladik, Вы писали:

V>Здравствуйте Sergey Zhulin, Вы писали:


SZ>>Это не довод,


V>Да, это не довод, но учитывать стоит.

Что учитывать-то?

SZ>>давай конкретные описания проблем. Зачем организовано это обсуждение? Ты хочешь всех убедить в бесполезности исключений или просто поболтать?


V>Я не пользуюсь исключениями в конструкторах Мне достаточно почитать высказывания людей, с этим сталкивавшихся. В частности, было что-то типа: "не видел еще ни одного компилятора, у которого бы не было проблем с исключениями в конструкторе".


V>Я просто высказал свое мнение. Конкретная проблема — неотловленный эксепшин в деструкторе приводит к "undefined behaviour".


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

Сергей.
Re[18]: эксепшины vs коды возврата
От: Vladik Россия  
Дата: 16.09.02 08:09
Оценка:
Здравствуйте Sergey Zhulin, Вы писали:

SZ>>>Это не довод,

V>>Да, это не довод, но учитывать стоит.
SZ>Что учитывать-то?

Глюки конкретных компиляторов, если ты ими пользуешься.

[...]
V>>Я просто высказал свое мнение. Конкретная проблема — неотловленный эксепшин в деструкторе приводит к "undefined behaviour".
SZ>Влад, определись. То конструкторы, то деструкторы...

Одна фигня.

SZ>Назови компиляторы и их проблемы при бросании исключений из конструкторов.


Поищи сам, вот в этом самом форуме. Мне влом. Упоминались конкретные компиляторы.
Как все запущенно...
Re[19]: эксепшины vs коды возврата
От: Sergey Zhulin  
Дата: 16.09.02 08:14
Оценка:
Здравствуйте Vladik, Вы писали:

V>Поищи сам, вот в этом самом форуме. Мне влом. Упоминались конкретные компиляторы.


Ну тогда ты не прав. Почему? Поищи сам в форуме.
Парни. Давай-те следующее, интересное обсуждение начнем

Сергей.
Re[20]: эксепшины vs коды возврата
От: Vladik Россия  
Дата: 16.09.02 08:17
Оценка:
Здравствуйте Sergey Zhulin, Вы писали:

V>>Поищи сам, вот в этом самом форуме. Мне влом. Упоминались конкретные компиляторы.

SZ>Ну тогда ты не прав. Почему? Поищи сам в форуме.

Может я и не прав, но проблемы будут у тебя

SZ>Парни. Давай-те следующее, интересное обсуждение начнем


Ну что ж, каждый остался при своем. Чего и следовало ожидать.
Как все запущенно...
Re[17]: эксепшины vs коды возврата
От: MaximE Великобритания  
Дата: 16.09.02 12:02
Оценка:
Здравствуйте Vladik, Вы писали:

V>Я просто высказал свое мнение. Конкретная проблема — неотловленный эксепшин в деструкторе приводит к "undefined behaviour".


Исключение в деструкторе — грубая ошибка.
Re[18]: эксепшины vs коды возврата
От: Vladik Россия  
Дата: 16.09.02 12:06
Оценка:
Здравствуйте MaximE, Вы писали:

V>>Я просто высказал свое мнение. Конкретная проблема — неотловленный эксепшин в деструкторе приводит к "undefined behaviour".

ME>Исключение в деструкторе — грубая ошибка.

Угу. Неотлавливаемая компилятором. Причем чем меньше источников эксепшинов — тем меньше вероятность ее возникновения.
Как все запущенно...
Re[19]: эксепшины vs коды возврата
От: MaximE Великобритания  
Дата: 16.09.02 12:14
Оценка: 5 (1)
Здравствуйте Vladik, Вы писали:

V>Здравствуйте MaximE, Вы писали:


V>>>Я просто высказал свое мнение. Конкретная проблема — неотловленный эксепшин в деструкторе приводит к "undefined behaviour".

ME>>Исключение в деструкторе — грубая ошибка.

V>Угу. Неотлавливаемая компилятором. Причем чем меньше источников эксепшинов — тем меньше вероятность ее возникновения.


Можно никаких методов и функций не вызывать, объектов не создавать — тогда даже коды возврата не нужны .
Re[17]: эксепшины vs коды возврата
От: Bell Россия  
Дата: 16.09.02 13:27
Оценка:
Здравствуйте Vladik, Вы писали:


V>Я просто высказал свое мнение. Конкретная проблема — неотловленный эксепшин в деструкторе приводит к "undefined behaviour".


Можно место в стандарте, где это написано?
Любите книгу — источник знаний (с) М.Горький
Re[19]: эксепшины vs коды возврата
От: jazzer Россия Skype: enerjazzer
Дата: 16.09.02 13:36
Оценка:
Здравствуйте Vladik, Вы писали:

V>Здравствуйте MaximE, Вы писали:


V>>>Я просто высказал свое мнение. Конкретная проблема — неотловленный эксепшин в деструкторе приводит к "undefined behaviour".

ME>>Исключение в деструкторе — грубая ошибка.

V>Угу. Неотлавливаемая компилятором. Причем чем меньше источников эксепшинов — тем меньше вероятность ее возникновения.


Логика железная :)

а чем меньше указателей и работы с динамической помятью — тем меньше вероятность, что мы получим access violation.
Это — аргумент в пользу отказа от указателей?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.