Здравствуйте, skyline, Вы писали:
S>Как вам уже написали, лучше инициализацию проводить не в конструкторе, а в отдельном методе.
Чушь. Исключение в конструкторе обычное дело если пишешь на С++, а не на С с классами.
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, skyline, Вы писали:
S>Я имею в виду, что
Ууу... Как все запущено... Так нормальные люди не пишут.
S>по сути, одно и тоже, а в обоих случаях программа становится плохо читаемой можно привести подобный пример с циклами, как мне сегодня писали, но циклы не нарушают логику, и являются базовым понятием теории логических схем.
А условные переходы значит уже не являются? S>Если ты считаешь, что то же вено для выбросов исключений, приведи пример, как это обозначается на логической схеме алгоритма.
Хм... Когда я их рисовал в последний раз о исключениях еще даже не слышал... Хотя если подумать то в системе с исключениями у каждой подпрограммы будут два выхода один с результатом второй с исключением.
S>Я плохо выразил свою мысль. Если у меня в проге редкая ошибка, то в первом случая прога будет падать по крайне мерее не сразу, а по моему опыту, лучше уж, если у клиента программа работает не правильно, чем падает с сообщением Windows
Плохой у тебя опыт и бедные твои заказчики.
S>Сколько людей, столько и мнений.
В моей программе перехватываются все исключения(просто надо немного заботися о проектировании). Болие того для выброса исключений я использую пару трюков вобщем лог с исключениями содержит очень подробную информацию о том что (имя исключения), где (фаил, строка), почему(проваленое условие) и коментарии(часть контекста по усмотрению программиста). А если учесть что формат лога строго стандартизирован то для него можно написать смотрелку(что я и сделал).
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, ssm, Вы писали:
ssm>Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>>Как написал WolfHound, лучше всего ловить через ссылку:
ssm>А почему не константную?
As you wish... А если ты поймал исключение, добавил туда еще какой нить информации и rethrow сделал?
Здравствуйте, Дмитрий Наумов, Вы писали:
ssm>А почему не константную?
ДН>As you wish... А если ты поймал исключение, добавил туда еще какой нить информации и rethrow сделал?
struct E{int i; E(const E &){...}};
void low_level(){
...
try{...}
catch(E &e){
...
e.i++;
raise e;//тоесть тут не произойдет копирование E?
...
}
...
}
void high_level{
try{
...
low_level();
...
}
catch(const E &e){
...
}
}
Здравствуйте, Alexey Chen, Вы писали:
AC>Но это, как и приведенный пример, уже из области C и ембеддед систем в которых C++ не держит исключений. AC>В EVC, например , их просто нет.
Почему нет? Есть. А если указать ключ /EHsc, то даже будет включена "unwind semantics". (EVC 4.0)
Здравствуйте, Дмитро, Вы писали:
Д>Здравствуйте, Alexey Chen, Вы писали:
AC>Но это, как и приведенный пример, уже из области C и ембеддед систем в которых C++ не держит исключений. AC>В EVC, например , их просто нет.
Д>Почему нет? Есть. А если указать ключ /EHsc, то даже будет включена "unwind semantics". (EVC 4.0)
Д>-- Д>Дмитрий
А оно не под CE.NET компилять умеет? Без хитрых приседаний. Это во-первых.
А во-вторых, зачем за новые баги, бабло M$ платить если у меня есть EVC 3.0 и его баги я знаю ?
Да и вопрос был не в этом. Есть некоторые ембеддед платформы для которых для меня доступен только gcc у которого не потрудились при портировании приделать исключения. Просто руководствуясь здравым смыслом, перед тем как писать утильный код который много где используеьтся и не зависит от платформы , стоит подумать, а действительно ли нужны эти исключения.
Здравствуйте, skyline, Вы писали:
S>Здравствуйте, Slick, Вы писали:
S>Здравствуйте, skyline, Вы писали:
S>Здравствуйте, Slick
S>Какими критериями руководствоваться при решении такой задачи? S>Или может быть нужен в корне другой подход? S>Если я правильно понял, вы спрашиваете, как групировать исключительные ситуации?
S>Да, именно так.
S>Просто интересно свежее мнение на эту тему.
S>Моё мнение таково — существуют 4 вида исключительных ситуаций S>1 Не критические ситуации S>2 Критические ошибки — программу надо срочно сворачивать, дальше работать нет смысла S>3 Программисткие ошибки — только на этапе разработки S>4 Ошибки какой-то внешней среды
Одна и та же ситуация может быть критической ошибкой, а может быть ничего не значащей фигней.
Посему как тут строить иерархию исключений, не очень понятно.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Это зависит от компилятора. На BCB5, если меня не подводили глаза — объект копируется. КД>Короче, всякое бывает
Что то мне казалось, что такие вещи регламентируются стандартом... Но во-первых утверждать не буду, во вторых Борланд волен делать что угодно...
S>Или может быть нужен в корне другой подход?
Общий смысл — ловишь базовый класс всех исключений, а потом через dynamic_cast анализируешь — что поймал.
У меня количество catch-ей сократилось как минимум в два раза
Вторым премуществом оказалось то, что все перехваченные исключения анализируются централизовано, поэтому добавлять новые категории исключений достаточно просто. Для COM объектов это оказалось — сам то
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Что то мне казалось, что такие вещи регламентируются стандартом... Но во-первых утверждать не буду, во вторых Борланд волен делать что угодно...
Это вопрос оптимизации... Так же, как возвращение объекта из функции.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>>Что то мне казалось, что такие вещи регламентируются стандартом... Но во-первых утверждать не буду, во вторых Борланд волен делать что угодно...
К>Это вопрос оптимизации... Так же, как возвращение объекта из функции.
А Bell в соседнем посте утверждает обратное... Сам я стандарт по этому пункту не изучал, но в Мейерсе вроде упоминалось отсутствие копирования, хотя может и глючит. А если копирование есть то:
try
{
try
{
// ...
CMyException e;
e.set(1);
throw e;
}
catch(CMyException e1)
{
e1.set(2);
throw;
}
}
catch(CMyException& e2)
{
// что здесь будет в e2 - 1 или 2 ?
}
Здравствуйте, Кодт, Вы писали:
К>Это вопрос оптимизации... Так же, как возвращение объекта из функции.
Нет, это не так:
15.1/4
...
The temporary persists as long as there is a handler being executed for that
exception. In particular, if a handler exits by executing a throw; statement,
that passes control to another handler for the same exception, so the temporary remains.
...