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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt неподдерживает exception. C чем это связано? Может на других OC нет их поддержки? 
:(
    Опции темы
sergey_85
Дата 28.11.2009, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет!


Вчера задавал вопрос про поддержку execption в Qt. Мне ответили, что Qt не поддерживает их (вместо этого ф-ции возв. true, false или код ошибки).

С чем это связано, может из-за того, что QT кроссплатформенная и исключения не поддерживаются в какой-то ОС?

Я собираюсь делать кросплатформенную прогу, вот и думаю юзать мне exception (это же стандарт с++) или обойтиись без них как в qt?

*cобирать приложение буду под MacOS, Windows, Linux.

спасибо!


--------------------
A good design always pays off.
PM MAIL   Вверх
JackYF
Дата 28.11.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Гугление даёт причину:

Цитата

Exception handling is not reasonably well supported on all compilers Qt
supports, blows up the size of your library and your application, is
difficult to handle together with e.g. signals and slots, etc.


Если ты собираешься переносить свою программу на те экзотические компиляторы, которые не поддерживают исключений или использовать Qt в своём коде, то от исключений, наверное, придётся отказаться. Впрочем, про насчёт совместного использования Qt и исключений я не уверен. Желательно спросить/поискать мнения людей, которые пробовали такую связку.


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


Пердупержденный
***


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

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



Свои исключения генерировать естественно ничто не мешает. Разве что здравый смысл.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
andrew_121
Дата 28.11.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(JackYF @  28.11.2009,  11:01 Найти цитируемый пост)
Впрочем, про насчёт совместного использования Qt и исключений я не уверен. Желательно спросить/поискать мнения людей, которые пробовали такую связку.

В документации, не раз говориться про НЕ использование в Qt исключений. Но сам, своими глазами видел их в коде.
Так что, думаю что все же они имеют право испускаться.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 28.11.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  28.11.2009,  20:10 Найти цитируемый пост)
Свои исключения генерировать естественно ничто не мешает. Разве что здравый смысл.
откуда такое отношение?
нравится писать спагетти код, с проверкой кодов возврата?

Добавлено через 27 секунд
Цитата(andrew_121 @  28.11.2009,  21:11 Найти цитируемый пост)
Но сам, своими глазами видел их в коде.

в коде Qt? smile 
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 28.11.2009, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(Lazin @  28.11.2009,  21:50 Найти цитируемый пост)
в коде Qt?

Да) щас покажу

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

%QTDIR%/src/gui/kernel/qwidget.cpp : 1021

Код

QWidget::QWidget(QWidget *parent, Qt::WindowFlags f)
    : QObject(*new QWidgetPrivate, 0), QPaintDevice()
{
    QT_TRY {
        d_func()->init(parent, f);
    } QT_CATCH(...) {
        QWidgetExceptionCleaner::cleanup(this, d_func());
        QT_RETHROW;
    }
}

и дальше..

вот макросы:
Цитата

%QTDIR%/src/corelib/global/qglobal.h : 1370

Код

#ifdef QT_NO_EXCEPTIONS
#  define QT_TRY if (true)
#  define QT_CATCH(A) else
#  define QT_THROW(A) qt_noop()
#  define QT_RETHROW qt_noop()
#else
#  define QT_TRY try
#  define QT_CATCH(A) catch (A)
#  define QT_THROW(A) throw A
#  define QT_RETHROW throw
#endif


По умолчанию компилируется с -UQT_NO_EXCEPTIONS

qt-4.6.0-opensource-msvc2008


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 28.11.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>откуда такое отношение?

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

Коды возвратов != спагетти. Месиво и из эксепшинов ничто не мешает нагородить. И так кстати часто случается: ни раз видел тысячи catch на все случаи жизни.

И вообще это крайне холиворная тема, ну ее нафиг.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 28.11.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  28.11.2009,  22:36 Найти цитируемый пост)
Они медленные, неуклюжие и жирные.

они исключительные ситуации

Цитата(djamshud @  28.11.2009,  22:36 Найти цитируемый пост)
Единственный повод использовать их - перехватывать исключительные ситуации через несколько вызовов.
я бы сказал, что главный повод их использовать - это то, что исключение нельзя проигнорировать, я уже тут писал об этом - http://forum.vingrad.ru/forum/topic-216818/0.html#

Цитата(djamshud @  28.11.2009,  22:36 Найти цитируемый пост)
Коды возвратов != спагетти. Месиво и из эксепшинов ничто не мешает нагородить. И так кстати часто случается: ни раз видел тысячи catch на все случаи жизни.

если пишешь на Haskell-e, и используешь монаду Maybe, то да, в остальных случаях - получается спагетти код, 
если операция1 то
    если операция2 то
        если ...
    иначе обработка ошибки
иначе обработка ошибки

есть 2 альтернативы, нечто похожее на монаду Maybe из хаскеля, либо исключения, в С++ доступен только второй вариант

Цитата(djamshud @  28.11.2009,  22:36 Найти цитируемый пост)
И вообще это крайне холиворная тема, ну ее нафиг.

ну что за манеры? smile
PM MAIL Skype GTalk   Вверх
djamshud
Дата 28.11.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



Цитата(Linus Torvalds)

I'd like to be able to just "ignore the bait", but... Time for some serious flamefesting! 


>они исключительные ситуации

Никто и не спорит. Другой вопрос - как их обрабатывать.

>я бы сказал, что главный повод их использовать - это то, что исключение нельзя проигнорировать

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

>есть 2 альтернативы

Альтернатив как оказалось несколько больше. И не удивлюсь, что есть еще. Навскидку.

3.
Код

if(someshit1){
//обработка
return 1;}
//....
if(someshit1){
//обработка
return 2;}


4. Одинаковые "обработки" выносятся в отдельный предсмертный блок функции, вызванный через goto. Сейчас в меня наверное полетит что-нибудь вроде "кто ж использует гоуту в двадцать первом то веке? деревня!". На деле это случается редко (на моей практике), но как по мне, так ничего плохого в этом нет: код легко читается, нет никаких спагетти и самое главное (шучу) - ни единого експшена.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 29.11.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  28.11.2009,  23:30 Найти цитируемый пост)
Придерживаюсь мнения, что программист имеет право проигнорировать все, что посчитает нужным.
а я придерживаюсь мнения, что разработчик библиотек, вправе забрать у программиста возможность игнорировать ошибки
зы
есть ошибки, которые можно игнорировать, к примеру, никто не проверяет, корректно-ли текст был выведен на консоль, для таких ситуаций и обработка ошибок - опциональна

Цитата(djamshud @  28.11.2009,  23:30 Найти цитируемый пост)
А если все совсем плохо - прибить софтинку не проблема, и совсем не обязательно для этого разматывать километровый стек.

в С++ - обязательно smile 

Цитата(djamshud @  28.11.2009,  23:30 Найти цитируемый пост)
Альтернатив как оказалось несколько больше. И не удивлюсь, что есть еще. Навскидку.
это вариации
вообще, есть один критерий, все эти вариации на тему спагетти кода - о том, как смешать обработку ошибок со всем остальным кодом, а исключения позволяют разделить нормальный код и код обработки ошибок. Если использовать не if а goto, или return, сути это не изменит, код помимо своих функций занимается обработкой нештатных ситуаций, это усложняет код и как следствие - уменьшает его надежность

Цитата(djamshud @  28.11.2009,  23:30 Найти цитируемый пост)
4. Одинаковые "обработки" выносятся в отдельный предсмертный блок функции, вызванный через goto. Сейчас в меня наверное полетит что-нибудь вроде "кто ж использует гоуту в двадцать первом то веке? деревня!". На деле это случается редко (на моей практике), но как по мне, так ничего плохого в этом нет: код легко читается, нет никаких спагетти и самое главное (шучу) - ни единого експшена.

не надо путать postmortal и нормальную обработку ошибок, есть приложения, для которых недопустима потеря данных, есть приложения для которых недопустим простой, представь, что в каком-нибудь авиадиспетчерском центре упадет приложение, оно конечно перезпуститься, но во время простоя может случиться удивительное smile

PM MAIL Skype GTalk   Вверх
bsa
Дата 29.11.2009, 00:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



djamshud, ты видимо не до конца понимаешь смысл исключений. Они генерируются тогда, когда данный участок программы понятия не имеет что делать с возникшей ситуацией. Это случается, допустим, раз в час. А результатом будет сообщение, что пользователь выполнил недопустимую операцию и будет уничтожен...  smile  smile Другими словами, исключение - это что-то внештатное, что теоретически может случиться, но маловероятно, и совершенно неважно, сколько времени будет разворачиваться стек - 0.1 мс или 100 мс. Так как в случае ручной обработки все будет тоже самое, только придется код анализа состояний писать самостоятельно.

А по поводу Qt и исключений могу сказать, что читал о странных проблема, которые возникают у тех, кто их кидает внутри слотов...
PM   Вверх
djamshud
Дата 29.11.2009, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



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

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

Так получается, что разработчик вспомогательного средства решает, что делать его (средства) пользователю. Странно оно как-то, не находите?

>в С++ - обязательно

Нет. Операционка не станет вызывать никаких деструкторов и стеки разматывать тоже не будет. Грохнет, освободит ресурсы и как ни в чем ни бывало.

>это вариации

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

>код помимо своих функций занимается обработкой нештатных ситуаций

Что во-первых вполне нормально, а во-вторых ничто не мешает локализовать обработку (именно локальную) в конце функции, оставив "наверху" основной функционал кода. И что мы имеем? Произошел маленький кердык - перешли в конец функции и закрыли сокет, вернули единицу, на верхнем уровне, приняли решение, что же делать дальше. Сравните: кердык - эксепшн - поиск, где же он перехватывается, закрытие сокета и принятие решение о дальнейших действих. Т.е. добросовестно смешиваем локальное и внешнее обработки ошибки. Очень удобно! Особенно поддерживать это чудо-юдо.

>во время простоя может случиться удивительное

И как же исключение спасет пассажиров и членов экипажа? Проморгали код возврата или проухали исключение - результат один - катастрофа. Потому что даже поймав исключение где-нибудь в main (последний рубеж обороны), хрен что толкового с ним сделаешь (толковое можно было сделать раньше), самолет уже в штопоре.

Добавлено через 3 минуты и 26 секунд
>djamshud, ты видимо не до конца понимаешь смысл исключений.

Может быть именно поэтому я не понял из вашего сообщения, в чем профит уничтожения пользователя именно через эксепшнsmile.

Добавлено через 8 минут и 10 секунд
PS. Не нужно мне не правильно понимать, я не за отмену исключений и не за аннигиляцию программистов, которые "правильно" их используют (почему не использую их я и как с этим живу - писал). Я против их тотального применения на каждый чих. Часто чих объясняют именно исключительностью, что таковой в 99% случаев не является.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 29.11.2009, 01:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  29.11.2009,  00:43 Найти цитируемый пост)
Да. А автомобиль обязан пристегивать свое содержимое ремнями безопасности и ограничивать силу нажатия на педаль.
самый простой пример, пользователь создает объект
Foo* foo = new Foo();
но во время создания возникает ошибка, тут дело даже не в том, что нельзя вернуть из конструктора код ошибки, проблема в том, что если пользователь проигнорирует ошибку, он будет пользоваться невалидным объектом, и при первом-же его использовании произойдет следующая ошибка, но причину этой ошибки найти будет сложнее

Цитата(djamshud @  29.11.2009,  00:43 Найти цитируемый пост)
Нет. Операционка не станет вызывать никаких деструкторов и стеки разматывать тоже не будет. Грохнет, освободит ресурсы и как ни в чем ни бывало.
а я думал, что мы договорились о том, что наше, управляющее самолетом приложение не пишет в лог "ААААААААААААА!!!!!!!!" и отваливается, а пытается продолжить работу, корректно
кстати, в некоторых случаях после перезапуска все не будет как ни в чем не бывало, если приложение должно обеспечивать целостность каких-либо данных на жестком диске и при этом оно упадет в середине какой-нибудь операции, изменяющей эти данные, то в следующий раз оно может и не запуститься smile 

Цитата(djamshud @  29.11.2009,  00:43 Найти цитируемый пост)
Да, и они демонстрируют отсутствие в коде всякого спагетти. Или давайте в таком случае называть макаронами любые ветвления.
они демонстрируют множество точек возврата из одной ф-ии, плохой стиль
в любом случае, без исключений, control flow будет намного сложнее

Цитата(djamshud @  29.11.2009,  00:43 Найти цитируемый пост)
Что во-первых вполне нормально, а во-вторых ничто не мешает локализовать обработку (именно локальную) в конце функции, оставив "наверху" основной функционал кода. И что мы имеем? Произошел маленький кердык - перешли в конец функции и закрыли сокет, вернули единицу, на верхнем уровне, приняли решение, что же делать дальше. 

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

Цитата(djamshud @  29.11.2009,  00:43 Найти цитируемый пост)
Потому что даже поймав исключение где-нибудь в main (последний рубеж обороны), хрен что толкового с ним сделаешь (толковое можно было сделать раньше), самолет уже в штопоре.
ну так раньше и нужно его обрабатывать
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 29.11.2009, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



А может в "С/С++ Общие вопросы" ? ;)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>Foo* foo = new Foo();

Указатель все равно будет корректным. Память успешно выделена. Стало плохо прям в конструкторе? Не помню, чтоб хоть раз такое сделал, но можно обойтись каким-нибудь внутренним флагом errno и убить недосозданный объект. В любом случае имхо обсуждению не подлежит из-за кривизны самой идеи - подыхать неродившись.

>а я думал, что мы договорились о том, что наше, управляющее самолетом приложение не пишет в лог "ААААААААААААА!!!!!!!!" и отваливается, а пытается продолжить работу, корректно

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

>они демонстрируют множество точек возврата из одной ф-ии, плохой стиль

Кому плохой, а кому - нет. Это чистой воды субъективизм. Кроме того с goto место возврата одно.

Код

int somefunc(){
int errno=0;
//...
_return:
//...
return errno;
}


Про кердыки посмеялся, спасибоsmile.

Произошел маленький кердык с сокетом. Сообщили верхнему уровню. Он не принял решения? Почему? Ну ладно, это мы переживем. Но почему же мы, зная, что кердык произошел где-то ниже, говорим верху-приверху, что кердык у нас? Ну так на это есть разные коды возвратов. Целый инт минус один. И повторю, ИМХО не совсем здорово, когда ошибки обрабатываются через несколько уровней вызовов. Но, как я пояснил, и код возврата можно (и нужно, раз уж на то пошло)
 пересылать правильно.

>ну так раньше и нужно его обрабатывать 

Ну так верно. И не важно, исключением, кодом возврата или магией.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
djamshud
Дата 29.11.2009, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>А может в "С/С++ Общие вопросы" ? ;)

Мы же обсуждаем правильность (или неправильность, как считают некоторые, не буду показывать пальцем) решение трольтеков отказаться от исключений. Низя нам в общие вопросы ).


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
maxxant
Дата 29.11.2009, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(sergey_85 @  28.11.2009,  08:55 Найти цитируемый пост)
С чем это связано, может из-за того, что QT кроссплатформенная и исключения не поддерживаются в какой-то ОС?

Я собираюсь делать кросплатформенную прогу, вот и думаю юзать мне exception (это же стандарт с++) или обойтиись без них как в qt?


Во первых не совсем верно "исключения не поддерживаются в какой-то ОС" - исключения С++ это исключения только от компилятора, и вопрос в том поддерживает их компилятор или нет, операционная система здесь не причём. Хотя есть исключение - это последние версии ОС Symbian, там они интегрированы в компилятор, вот ссылка на документ описывающий зачем и как http://developer.symbian.com/main/download...0Exceptions.pdf.
Поскольку Symbian это продукт Nokia, а теперь ей принадлежит и Qt, то для того чтобы сделать поддержку для S60 в Qt 4.6 просто необходимо обрабатывать исключения в самой библиотеке, именно поэтому там они и появились. Сама по себе Qt не генерирует исключения поскольку не все компиляторы это поддерживают ведь существуют и мало распростанённые ОС, где хорошо если С++ вообще есть. Тем не менее вы можете использовать исключения, как обычно в С++, если понимаете что делаете, хотя судя по вопросу, не понимаете ;)  так что лучше не надо, а то отлаживать будете долго и ругать невинный компилятор. При использовании Qt необходимость в исключениях отпадает сама  по себе, через механизм сигналов/слотов вы сможете не хуже других (ну почти) обрабатывать ошибки, н.р.: signals: void QTcpSocket::error ( QAbstractSocket::SocketError socketError ) подключили к слоту обработчика и обрабатывайте . С опытом использования Qt тяга к исключениям пройдёт. К тому же в больших проектах к исключениям относятся очень осторожно, поскольку их обработка плохо мастабируется (именно в С++, в других языках бывает по другому), и то что красиво смотриться в однопоточном приложении и практически независимом от библиотек проекте в несколько десятков файлов, может обернуться тихим ужасом и недельными отладками в более крупном, использующем несколько потоков (в каждом потоке свой стек, и не получиться передать исключения между ними, в отличие от сигнала ошибки в Qt).

Цитата(Lazin @  29.11.2009,  00:10 Найти цитируемый пост)
для которых недопустима потеря данных, есть приложения для которых недопустим простой, представь, что в каком-нибудь авиадиспетчерском центре упадет приложение, оно конечно перезпуститься, но во время простоя может случиться удивительное


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

PM MAIL   Вверх
andrew_121
Дата 29.11.2009, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(djamshud @  29.11.2009,  01:54 Найти цитируемый пост)
Низя нам в общие вопросы ). 

Просто тема довольно интересная. Но увы, никому и в голову не придет, что это могут обсуждать в разделе по кроссплатформенному программированию. Сюда не так много народа заглядывает ;) А там вам и повеселее будет smile


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



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

Плюс си часто заставляет программиста писать более быстрый код, пусть временами и в ущерб понятности. Плюс сишный код впринципе работает быстрее, ибо классы, наследование, RTTI, исключения, опять же. Для автопилота это очень важно, я думаю.

maxxant, и вообще очень познавательная история.

>Просто тема довольно интересная

Да лишь бы в "священные войны" не отправили, там так вообще кроме троллей мало кто прочитает.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 29.11.2009, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



djamshud, ладно, уговорил, не используй исключения smile 

Цитата(maxxant @  29.11.2009,  02:07 Найти цитируемый пост)
Во первых не совсем верно "исключения не поддерживаются в какой-то ОС" - исключения С++ это исключения только от компилятора, и вопрос в том поддерживает их компилятор или нет, операционная система здесь не причём
исключения поддерживаются именно на уровне операционной системы smile 

Цитата(maxxant @  29.11.2009,  02:07 Найти цитируемый пост)
К тому же в больших проектах к исключениям относятся очень осторожно, поскольку их обработка плохо мастабируется (именно в С++, в других языках бывает по другому), и то что красиво смотриться в однопоточном приложении и практически независимом от библиотек проекте в несколько десятков файлов, может обернуться тихим ужасом и недельными отладками в более крупном, использующем несколько потоков (в каждом потоке свой стек, и не получиться передать исключения между ними, в отличие от сигнала ошибки в Qt).

[irony]ну надо-же, в каждом потоке свой стек[/irony]
кстати, исключения можно передавать между потоками, поток, который делает join, потом заново их бросает, все получается довольно прозрачно
хозяйке на заметку: задача инженера - сделать реализацию простой, "просто" сделать сложнее чем сделать "сложно" smile 
поэтому кичиться тем, что у нас все сложно, поэтому мы не используем исключения - по меньшей мере странно, мы проектируем системы так, что-бы их потом было легко развивать искать в них ошибки, а исключения, при правильном использовании позволяют упростить систему, конечно можно сделать большую и сложную систему, и потом говорить, что если-бы мы использовали исключения, то была-бы вообще жопа...
вообще, стоит посмотреть на джавистов/дотнетчиков, они делают приложения, удовлетворяющие такому количеству бизнес правил, какое большинству цэпэпэ программистов и не снилось, и при этом пользуются исключениями

Цитата(maxxant @  29.11.2009,  02:07 Найти цитируемый пост)
Большинство ошибок - это логические упущения программиста или проектировка системы. 
ну еще-бы, обрабатывая все ошибки вручную ты конечно допустишь меньше логических ошибок smile 

Цитата(maxxant @  29.11.2009,  02:07 Найти цитируемый пост)
Пример с авиадиспетчерским центром веселит, по случайному совпадению, я как раз являюсь разработчиком ПО для диспетчерских центров, и не вижу никакой связи между исключениями и потерей данных, скорее наоборот, слава богу их у нас практически нет, ибо их поддержка была бы кошмаром, даже в небольшом модуле с 10 потоками.
по случайному совпадению, я то-же являюсь разработчиком ПО для диспетчерских центров, слава богу не авиационных, и исключения мы используем во всех проектах написанных на С++
> и не вижу никакой связи между исключениями и потерей данных 
есть связь между неиспользованием исключений и ростом сложности / увеличением количества ошибок, связных с тем, что разработчик не предусмотрел, что та или иная операция не всегда выполняется корректно, вот и все.

Добавлено через 1 минуту и 1 секунду
Цитата(djamshud @  29.11.2009,  02:26 Найти цитируемый пост)
Да лишь бы в "священные войны" не отправили

что в этом плохого, я весь вечер этого и добиваюсь smile 
PM MAIL Skype GTalk   Вверх
djamshud
Дата 29.11.2009, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>djamshud, ладно, уговорил, не используй исключения

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

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

Голословное заявление. Не видно связи между (не)использованием исключения и недосмотром за выполнением операций. Или вы в main городите один бааальшой перехватчик на все случаи жизни и обучаете его правильно реагировать на всевозможные ошибки, так, на всякий случай?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Abyx
Дата 29.11.2009, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(djamshud @  29.11.2009,  02:26 Найти цитируемый пост)
Плюс сишный код впринципе работает быстрее, ибо классы, наследование

да..... наследование конечно тормозит выполнение кода....
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 03:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>да..... наследование конечно тормозит выполнение кода.... 

Мда... Хождение по таблицам виртуальных функций уже давно выполняется на специализированном сопроцессоре и равносилен одному такту ЦПУ... Быстрота особенно ощущается при наследовании в несколько поколений - там включается турбонаддув сопроцессора... А когда среди этого где-нибудь мелькает множественное наследние, запускатеся реактивная тяга... Такие дела...

Добавлено @ 03:06
Речь естественно идет о полезном коде, накладные расходы в который не входят. И которые "тормозят" выполнение (полезного) кода.

Upd.
>исключения поддерживаются именно на уровне операционной системы
Всегда думал, что это не так. По-моему компилятор сам в силах решить, как бросать и ловить исключения. Поделитесь ссылкой, где бы об этом поподробнее рассказывалось? Нагуглить с ходу не получилось.

Это сообщение отредактировал(а) djamshud - 29.11.2009, 03:18


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
maxxant
Дата 29.11.2009, 03:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2Lazin:
Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
исключения поддерживаются именно на уровне операционной системы  


мы говорим, про исключения С++, каким боком они привязаны к операционке. То что в операционных системах  MS Windows есть SEH, то что в юниксах есть сигналы, и исключения возникающие на уровне процессора при попытке обращения к памяти, деления на ноль и т.д. мы знаем, и как то, что это обрабатывается в операционке понятно. Только причём здесь исключения С++ ???. Они реализовываются вполне программно.

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
[irony]ну надо-же, в каждом потоке свой стек[/irony]


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

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
кстати, исключения можно передавать между потоками, поток, который делает join, потом заново их бросает, все получается довольно прозрачно

это что C# ?

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
стоит посмотреть на джавистов/дотнетчиков, они делают приложения, удовлетворяющие такому количеству бизнес правил, какое большинству цэпэпэ программистов и не снилось, и при этом пользуются исключениями


Выше я упомянул, что в некоторых языках по другому. В java или .net исключения - это основной способ обработки ошибок. Причем здесь C++ Qt?

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
есть связь между неиспользованием исключений и ростом сложности / увеличением количества ошибок, связных с тем, что разработчик не предусмотрел, что та или иная операция не всегда выполняется корректно, вот и все.


логически некорректная операция на С++ не вызывает исключений, если это не задано явно через throw, даже деление на ноль, выход за пределы памяти вызывают системное исключение, либо сигнал. Исключения в С++ позволяют лишь  локально, модульно упростить написание кода. В сочетании с  Qt потребность в них практически отпадает, да и пользоваться осторожнее приходиться.
Чувствуется вы потроллить сюда пришли.

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
по случайному совпадению, я то-же являюсь разработчиком ПО для диспетчерских центров, слава богу не авиационных, и исключения мы используем во всех проектах написанных на С++.


Как замечательно. И насколько хорошо у вас они сочетаются с Qt? Какие подводные камни могут встретиться при их использовании с Qt? Чувствуется ли их острая неоходимость? Может у вас ещё boost прикручен поэтому уж без них никак не получается? А может вы путается С++ с  С#  или ещё с чем, где есть полноценная поддерка исключений(если можно так сказать)?



Это сообщение отредактировал(а) maxxant - 29.11.2009, 04:04
PM MAIL   Вверх
maxxant
Дата 29.11.2009, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(djamshud @ 29.11.2009,  02:26)
>ну там так вообще только чистый "си", поскольку компилятор на порядок проще и потенциально содержит меньше ошибок

Плюс си часто заставляет программиста писать более быстрый код, пусть временами и в ущерб понятности. Плюс сишный код впринципе работает быстрее, ибо классы, наследование, RTTI, исключения, опять же. Для автопилота это очень важно, я думаю.

Тут больше конечно надёжность, ибо по международным требованиям: DO-178b многое нужно проверить. В том числе полное покрытие кода,  т.е. компилируется инструментированный код, с помощью которого можно проверить; все ли операторы, функции, условия выполнились, и если что-то не выполняется, делается подробный анализ с отчётом об ошибке, либо обоснованием что всё нормально и этот код мёртвый, т.е default в свитчах и т.п. кот при данных условиях не выполняются. В с++ это очень сложно сделать даже используя в пол-мощи.

Да и кстати да, там только realtime всегда, и никакого динамического выделения памяти, динамических загрузок чего либо. то есть от С++ толку в той области очень немного, а проблем вагон (не говоря про стоимость сертифицированных компиляторов для этого дела, только сишный компилятор для небольшого офиса (человек 10-15) с урезанной лицензией на 1 тип процессора из 20 возможных, чтобы купить нужно  квартиру в Москве продать, и причём для каждого филиала отдельная лицензия нужна - сервера лицензий, аудиты, ...).

Это сообщение отредактировал(а) maxxant - 29.11.2009, 04:31
PM MAIL   Вверх
Lazin
Дата 29.11.2009, 12:50 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  29.11.2009,  02:49 Найти цитируемый пост)
Т.е. вы отказываетесь показать хотя бы один случай, когда исключение спасет мир? Ну или хотя бы одну человеческую жизнь? То, что они усложняют сопровождение кода, я уже писал... И не получил ответа кстати.
все ждут пример, затаив дыхание smile
вариант с кодами ошибок:
Код

enum {
    NO_CONNECTION,
    CANT_OPEN_FILE,
    IO_ERROR,
    CONNECTION_CLOSE_ERROR,
    FILE_CLOSE_ERROR
};

int ReceiveFile(MyTCPConnection* connection, std::string file_name)
{
    if (connection->operable() == false)
        return NO_CONNECTION;
        
    MyFile file(file_name);
    if (file.open() == false)
        return CANT_OPEN_FILE;
        
    char buff[0x10000];
    while(true)
    {
        ErrorCode ec;
        size_t bytes_transferred = 
            connection->readsome(make_buffer(buff, 0x10000), &ec);
            
        if (ec == MyTCPConnection::EOF)
            break;
        
        if (ec)
            return IO_ERROR;
            
        if (!file.write(buff, bytes_transverred))
        {
            LOG_ERROR(("File I/O error - write"));
            return IO_ERROR;
        }
    }
    
    if (!connection->close())
        return CONNECTION_CLOSE_ERROR;
    
    if (!file.close())
    {
        LOG_ERROR(("File I/O error - close"));
        return FILE_CLOSE_ERROR;
    }
    return 0;
}

void HigerLevel()
{
    ...
    int ec = ReceiveFile(connection, name);
    switch(ec)
    {
    case NO_CONNECTION:
    {
        int ec = connection->open();
        if (ec)
        {
            ...
        }
        HigherLevel(); // retry
    }
    break;
    case CANT_OPEN_FILE:
    {
        name = get_alernative_filename();
        HigherLevel();
    }
    break;
    ...
    };
    ...
}

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

void ReceiveFile(MyTCPConnection* connection, std::string file_name)
{
    if (connection->operable() == false)
        throw TCPException("ReceiveFile can work only with alredy opend connection");

    MyFile file(file_name);
    file.open();
    char buff[0x10000];
    while(true)
    {
        size_t bytes_transferred = connection->readsome(make_buffer(buff, 0x10000));
        
        if (connection->is_eof())
            return break;
            
        file.write(buff, bytes_transverred);
    }
    connection->close();
    file.close();
}

void HigherLevel()
{
    ...
    try
    {
        ReceiveFile(connection, filename);
    }
    catch(TCPException const& e)
    {
        Reconnect();
        HigherLevel();
    }
    catch(FileError const& e)
    {
        if (e->code() != MyFile::CantOpen)
            throw;
        filename = get_alternative_filename();
        ReceiveFile();
    }
}

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

нетрудно заметить, что во втором варианте намного меньше boilerplate кода, к тому-же в первом варианте непонятно как передавать системные коды ошибок

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


Эксперт
****


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

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



Цитата(djamshud @  29.11.2009,  03:04 Найти цитируемый пост)
Мда... Хождение по таблицам виртуальных функций уже давно выполняется на специализированном сопроцессоре и равносилен одному такту ЦПУ... Быстрота особенно ощущается при наследовании в несколько поколений - там включается турбонаддув сопроцессора... А когда среди этого где-нибудь мелькает множественное наследние, запускатеся реактивная тяга... Такие дела...
деревня smile
при наследовании не создается куча таблиц вирт. функций, там по прежнему одна таблица, в самом объекте будет просто храниться указатель на таблицу, вот и все, к тому-же можно наследовать от класса, не содержащего вирт. функций
То-есть вызов вирт-функции в наследнике и в родителе - одинаков, это получение указателя на ф-ю и вызов этой ф-ии, очень дешевая операция.

Цитата(djamshud @  29.11.2009,  03:04 Найти цитируемый пост)
Всегда думал, что это не так. По-моему компилятор сам в силах решить, как бросать и ловить исключения. Поделитесь ссылкой, где бы об этом поподробнее рассказывалось? Нагуглить с ходу не получилось.

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
мы говорим, про исключения С++, каким боком они привязаны к операционке. То что в операционных системах  MS Windows есть SEH, то что в юниксах есть сигналы, и исключения возникающие на уровне процессора при попытке обращения к памяти, деления на ноль и т.д. мы знаем, и как то, что это обрабатывается в операционке понятно. Только причём здесь исключения С++ ???. Они реализовываются вполне программно.
в компиляторе VC++, оператор throw - реализуется через RaiseException, тоесть все исключения работают через SEH, и исключения С++(синхронные) и системные исключения (асинхронные), просто по дефолту, компилятор обрабатывает только C++ исключения, можно сделать так, что в вашей программе появятся такие исключения как AVException, DivByZeroException итд
в *nix ах наверное то-же так можно сделать smile 

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
отчего ирония? Как бы локальные объекты в каждом потоке живут не зависимо, и крутят свой стек в разные стороны одновременно.
ну это как-бы очевидно настолько, что Капитан Очевидность удавился от зависти smile 

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
это что C# ?
нет, join, это то место, где основной поток дожидается завершения дочернего, примерно так:
Код

boost::thread thread(backgroundWorker);
...
thread.join();
if (backgroundWorker.failed())
    backgroundWorker.throw_error();
в С++ это реализуется кривыми руками программиста

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
Выше я упомянул, что в некоторых языках по другому. В java или .net исключения - это основной способ обработки ошибок. Причем здесь C++ Qt?
в С++ - исключения - основной инструмент обработки ошибок, даже new бросает исключение, нельзя их игнорировать если не пишешь на Си конечно smile 

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
логически некорректная операция на С++ не вызывает исключений, если это не задано явно через throw, даже деление на ноль, выход за пределы памяти вызывают системное исключение, либо сигнал. Исключения в С++ позволяют лишь  локально, модульно упростить написание кода. В сочетании с  Qt потребность в них практически отпадает, да и пользоваться осторожнее приходиться.
Чувствуется вы потроллить сюда пришли.
прежде чем обвинять кого-либо в троллинге и некомпетентности, нужно самому научиться разбираться в вопросе, системные исключения можно транслировать в исключения С++(типизировать), их можно перехватывать через catch(...) (игнорировать тип)

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
Как замечательно. И насколько хорошо у вас они сочетаются с Qt?
я не использую Qt, я вообще не пишу приложения с пользовательским интерфейсом

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
Может у вас ещё boost прикручен поэтому уж без них никак не получается? А может вы путается С++ с  С#  или ещё с чем, где есть полноценная поддерка исключений(если можно так сказать)?
естественно я использую boost, STL и много чего еще, и это не мешает мне писать приложения, работающие в режиме 24x7
нельзя использовать ни одну современную С++ библиотеку, не используя исключения

PM MAIL Skype GTalk   Вверх
andrew_121
Дата 29.11.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Вах. Дочитал smile


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>деревня

Ок. Маленький бенчмарк (полностью высосанный из пальца) для горожан. Вызывается (используется) всего пять методов.
Код

virtual void B1::A_a()
virtual void A::A_a()
virtual void D::A_b()
virtual void D::C_a()
virtual void E::C_b()

для случая _1. И пять обыкновенных методов для случая _2.

Код

#include<stdio.h>                      
#define printf(...)
#define _1

#ifdef _1
class A{ 
public:  
virtual void A_a(){printf("%s\n",__PRETTY_FUNCTION__);}
virtual void A_b()=0;                                  
};                                                     

class B1:virtual public A{
public:                   
virtual void A_a(){       
printf("%s\n",__PRETTY_FUNCTION__);
A::A_a();}                         
};                                 

class B2:virtual public A{};

class C:public B1,public B2{
public:
virtual void C_a(){printf("%s\n",__PRETTY_FUNCTION__);}
virtual void C_b()=0;
};

class D:public C{
public:
void C_a(){printf("%s\n",__PRETTY_FUNCTION__);}
void A_b(){printf("%s\n",__PRETTY_FUNCTION__);}
};

class E:public D{
public:
void C_b(){printf("%s\n",__PRETTY_FUNCTION__);}
};
#endif

#ifdef _2
class C{
public:
void c1(){}
void c2(){}
void c3(){}
void c4(){}
void c5(){}
};
#endif



int main(){
#ifdef _1
C *object=new E;
for(int i=0;i<99999999;i++){
object->A_a();
object->A_b();
object->C_a();
object->C_b();
//break;
}
#endif

#ifdef _2
C *object=new C;
for(int i=0;i<99999999;i++){
object->c1();
object->c2();
object->c3();
object->c4();
object->c5();}
#endif

delete object;
return 0;
}



Случай _1:
real    0m1.891s
real    0m1.887s
real    0m1.910s

Случай _2:
real    0m1.170s
real    0m1.178s
real    0m1.177s

Итого ~0.73 секунды простоя на 100 миллионов вызовов. Сишники могут порадоваться, их время меньше секунды.

>можно наследовать от класса, не содержащего вирт. функций

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

>в *nix ах наверное то-же так можно сделать

Можно, но не нужно. К счастью оказалось, что операционка ничего не знает о плюсовых исключениях, и это правильно, я считаю. Мир не перевернулся.

Lazin, пример с ексепшином и кодом возврата посмотрю чуть позже.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
W4FhLF
Дата 29.11.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 2
Всего: 121



Цитата(djamshud @  29.11.2009,  14:53 Найти цитируемый пост)
Итого ~0.73 секунды простоя на 100 миллионов вызовов. Сишники могут порадоваться, их время меньше секунды.


Если методы в классе делают что-то сложнее "a + b", то оверхед на вызов будет очень мал относительно исполнения всего кода. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
djamshud
Дата 29.11.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>Если методы в классе делают что-то сложнее "a + b", то оверхед на вызов будет очень мал относительно исполнения всего кода. 

Смотря что и смотря где. Если это текстовый редактор, то и фиг с ним. А если это хреновина, считающая что-то несколько дней и делающая несметное количество вызовов, то уже многовато.

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

Заметьте, я не говорил, что плюсы - тормоз несусветный. Я все лишь отметил несколько причин более медленной работы плюсов в сравнении с си. ~0.73 секунды это на неслабой машинке. Думается, на ПКшке пяти лет отроду разница будет заметнее, а на бортовом компьютере еще больше.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 29.11.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  29.11.2009,  14:53 Найти цитируемый пост)
Итого ~0.73 секунды простоя на 100 миллионов вызовов. Сишники могут порадоваться, их время меньше секунды.

не пускай пыль в глаза
вызов вирт. ф-ии при множественном виртуальном наследовании некорректно сравнивать с обычным вызовом ф-ии
хотя-бы потому, что если тебе нужна динамическая диспетчеризация вызова в зависимости от динамического типа объекта, тебе придется либо использовать вирт. ф-ю, либо изобретать свой аналог таблицы виртуальных функций
зы
за все время работы я ни разу не использовал множественное виртуальное наследование, засим все о виртуальных функциях, так-как это smile 
PM MAIL Skype GTalk   Вверх
djamshud
Дата 29.11.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>  smile 

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

На основании вашего примера можно сделать вывод либо о вашей безграмотности, либо о том, что вы пытаетесь привести заведомо неуклюжий пример, показывающий рулезность эксепшинов. Я искренне надеюсь, что второй вариант. Когда все кое-как исключения действительно рулят, браво! Куча сущностей и действий намешана в одну кучу, ну что это за детский сад? Писали бы вы на си - было б вам оправдание, хотя и на си пишут красивее. А тут классы зачем-то примешаны и эксепшины до кучи.

А что, если читать будем из файла? А писать в сокет? А если в UDP? А если читать из сокета, парсить его и писать в логгер результат? А если писать в БД распарсенную структуру? На каждый чих напишем функцию - это же так легко, а копипаста в наше время делается в два счета.

Давайте уж говорить о более общей задаче, ибо с++ позволяет замечательно абстрагироваться, - транслировании данных из одного источника в другой. Я бы сделал так (внимание! возможны синтаксические, семантические и логические ошибки. алсо примеры не дописаны, они лишь показывают суть):

Что-то позволяющее читать и/или писать:
Код
class someIO {
protected:
    int _errno;
    buffer _buf;//some like std::vector
    int rwlen;//TODO:must be optional
    virtual int realRead(int)=0;

public:
    enum {ERR_IO_READ=1,ERR_IO_WRITE,__LAST};
    someIO() {
        this->errno=0;
        this->rwlen=1024;
    }
    buf const& buf()const {
        return this->_buf;
    }
    int getErrno()const {
        return this->_errno;
    }
    int read(int);
    int write(someIO*);
    virtual int write(buffer const&)=0;
    virtual bool eof()=0;
};

int someIO::read(int len) {
    buf.reset();
    while (!this->eof()) {
        if (this->realRead(len==-1?this->rwlen:len)!=0)return this->_errno;
        if (len!=-1)break;
    }
    return 0;
}

int someIO::write(someIO *io) {
    while (!io->eof()) {
        if (io->read(this->rwlen)!=0)return 0;
        if (this->write(io->buf())!=0)return this->_errno;
    }
    return 0;
}


Файл обыкновенный. Для операций используется API C89.
Код
class fileIO:public someIO {
protected:
    FILE *file;
    int realRead(int);

public:
    enum {ERR_FOPEN=someIO::__LAST,ERR_FCLOSE,__LAST};
    fileIO():someIO() {
        this->file=0;
    }
    int open(char const*,char const* ="rw");
    int close();
    bool eof();
    int write(buffer const&);
};

int fileIO::open(char const *fname,char const *mode) {
    if ((this->file=fopen(fname,mode))==0)
        return this->_errno=ERR_FOPEN;
    return 0;
}

int fileIO::close() {
    errno=0;
    fclose(this->file);
    if (errno!=0)return this->_errno=ERR_FCLOSE;
    return 0;
}

int fileIO::write(buffer const &buf) {
    if (fwrite(buf.data(),sizeof(char),buf.count(),this->file)==0)
        return this->_errno=ERR_IO_WRITE;
    return 0;
}


Сокет. По идее он должен быть дальше наследован для определения свойств TCP- и UDP-соединений, но сейчас не суть.
Код
class socketIO:public someIO {
protected:
    int socket;
public:
    enum {ERR_SOCK_BIND=someIO::__LAST,ERR_SOCK_CREATE,/*other errors*/__LAST};
    int connect(char const *ip,short port);
//...
};


И наконец кульминация. Использование всей этой красоты. На разного рода ошибки навешиваются любые обработки в ифах и свичах с пустыми циклами. Можно их засунуть в вечные циклы или рекурсивно вызвать main - не суть и совершенно не касается нашей маленькой задачи.
Код
int main() {
    fileIO file;
    if (file.open("file")!=0) {}
    socketIO sock;
    if (sock.connect("127.0.0.1",22)!=0) {}
    file.write(&sock);
    switch (file.getErrno()) {}
    switch (sock.getErrno()) {}
    file.close();
    sock.close();
    return 0;
}


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

Это сообщение отредактировал(а) djamshud - 29.11.2009, 20:42


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
andrew_121
Дата 29.11.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



djamshud, Если код писали вы, хорошо. Но не уметь форматировать код(хоть в каком-то стиле), это плохо. Очень интересно понять его, но глаза дороже.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>djamshud, Если код писали вы, хорошо. Но не уметь форматировать код(хоть в каком-то стиле), это плохо. Очень интересно понять его, но глаза дороже.

Прошу прощения, не уследил. Забыл через форматировщик прогнать. У меня на форматировании глаза разбегаются и мне становится сложно понимать код, поэтому при написании не использую его. Может быть когда-нибудь я избавлюсь от этого недостатка.

Fixed.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
andrew_121
Дата 29.11.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



djamshud, Спасибо.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 29.11.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  29.11.2009,  19:37 Найти цитируемый пост)
И наконец кульминация. Использование всей этой красоты. На разного рода ошибки навешиваются любые обработки в ифах и свичах с пустыми циклами. Можно их засунуть в вечные циклы или рекурсивно вызвать main - не суть и совершенно не касается нашей маленькой задачи.

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


Кодофей
****


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

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



 smile 
Код

    int getErrno()const {
        return thid->_errno;
    }

ошибочка.

Код

int open(char const*,char const="rw");

ошибочка.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



andrew_121, fixed. Не стоит столь придирчиво его исследовать, он не претендует на звание иконы. Просто мое мнение, как нужно решать подобные задачи на с++.

Добавлено через 11 минут и 41 секунду
>я не назвал бы это красотой, это можно использовать на низком уровне

Нет-нет, мой уважаемый и опытный собеседник, вы не правы. Он низкоуровневый лишь на уровне библиотеки - того, что использует программа main. Вместо fopen'ов внутри библиотеки можно использовать какие-нибудь stl-евские или Qt-шные костыли, суть не изменится. А уж на уровне приложения использование этой библиотеки высокоуровневое - дальше некуда.

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

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

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
andrew_121
Дата 29.11.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(djamshud @  29.11.2009,  20:44 Найти цитируемый пост)
он не претендует на звание иконы

я атеист!



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 29.11.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  29.11.2009,  20:44 Найти цитируемый пост)
Исключительная - это когда мы читаем послание президента и вдруг находим в нем заветную фразу. Тут же летит исключение, перехватываемое в другом конце софтины, и вот уже на америку пошли бомболеты... 
Это как раз не исключительная - это то, ради чего послание читалось.  smile 

PM   Вверх
maxxant
Дата 30.11.2009, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Lazin @  29.11.2009,  13:24 Найти цитируемый пост)

нет, join, это то место, где основной поток дожидается завершения дочернего, примерно так:

boost::thread thread(backgroundWorker);
...
thread.join();
if (backgroundWorker.failed())
    backgroundWorker.throw_error();
в С++ это реализуется кривыми руками программиста


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

Цитата(Lazin @  29.11.2009,  13:24 Найти цитируемый пост)
я не использую Qt, я вообще не пишу приложения с пользовательским интерфейсом


Цитата(Lazin @  29.11.2009,  13:24 Найти цитируемый пост)
естественно я использую boost, STL и много чего еще, и это не мешает мне писать приложения, работающие в режиме 24x7. 


Ну и чудесно. Собственно я и не сомневался.

Цитата(Lazin @  29.11.2009,  13:24 Найти цитируемый пост)
нельзя использовать ни одну современную С++ библиотеку, не используя исключения


Qt не использует исключения, хотя и обрабатывает... собственно разговор изначально про неё и кроссплатформенность. Так вот я не вижу причин чтобы они оттуда генерились вообще - то есть необходимость такая и не нужна. Есть там своя надстройка над языком которая неплохо работает и главное реально упрощает код и обработку ошибок, а заодно и плохо совместима с С++ exceptions. Плюс ко всему существуют биндинги Qt для С и кучи других языков, в которых поддержка исключений либо отсутствует, либо реализована иначе. Плюс, чтобы вы там не говорили, худшее понимание кода менее опытными колегами, собственно, в опес сорсе и крупных конторах, типа гугла, мне чаще встречалось в гадлайнах  запрет на генерирование исключений. Ибо даже такое встречается часто:

Код

try
{
    char *p = new[somesize];
    call1(...);
    сall2(...);
     ...
    callN(...);
}
catch(blabla)
{
    some_error_report(...)
}



Кстати, говоря, возможно автор топика имел ввиду именно виндовый SEH, когда приводил пример с билдером. Только вот в Qt этого нет, то есть нужно делать действительно ручками для винды (ну или там при помощи MSVS) и для *никсов своими силами.


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


Эксперт
****


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

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



Цитата(djamshud @  29.11.2009,  20:44 Найти цитируемый пост)
Если бы вы посмотрели внимательнее, то обратили бы внимание, что ничто никуда не гоняетсяи обрабатывается там, где должно обрабатываться.

ну это я вижу, но как корректно, черт возьми, можно обработать ошибку "диск, мать его, защищен от записи" в классе fileIO? smile

Цитата(maxxant @  30.11.2009,  02:54 Найти цитируемый пост)
Ну и чудесно. Собственно я и не сомневался.

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

Цитата(maxxant @  30.11.2009,  02:54 Найти цитируемый пост)
Плюс, чтобы вы там не говорили, худшее понимание кода менее опытными колегами, собственно, в опес сорсе и крупных конторах, типа гугла, мне чаще встречалось в гадлайнах  запрет на генерирование исключений.

В стайл гайде гугла есть запрет на исключения, но не потому что исключения это сложно, как раз наоборот, там проблема в другом, нужно заранее подумать, а что если вот эта ф-я/метод бросит исключение, не произойдет-ли утечка памяти или что-нибудь в этом роде, если у вас весь код - новый, вы в курсе, что существуют исключений и используете RAII для управления ресурсами, то все в порядке, но если у вас куча legacy кода, который написан так, как-будто исключений не существует, то могут быть проблемы. В общем, их старый код имеет плохой дизайн, ибо написан 10 лет назад, тогда, когда С++ имел мало общего с современным С++.
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 30.11.2009, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(Lazin @  30.11.2009,  06:44 Найти цитируемый пост)
"диск, мать его, защищен от записи"

последняя стадия. Доктор... smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 30.11.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>как корректно, черт возьми, можно обработать ошибку "диск, мать его, защищен от записи" в классе fileIO?

fopen(file,"w") потерпит фэйл, _errno станет ERR_FOPEN. При этом в _самом_ классе ее обрабатывать не нужно - не его это дело орать "ммммать, что-то пошло наперекосяк!".

Если вопрос касался детализации ошибки защищенного диска, то нужно добавить еще один тип ошибки. Я же не писал, что пример полон и готов к крупномасштабному внедрению. Как раз наоборот.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 30.11.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  30.11.2009,  11:23 Найти цитируемый пост)
fopen(file,"w") потерпит фэйл, _errno станет ERR_FOPEN. При этом в _самом_ классе ее обрабатывать не нужно - не его это дело орать "ммммать, что-то пошло наперекосяк!".

понимаешь, в чем фишка, любой императивный код, по сути, это последовательность связанных друг с другом операций, последующие операции как правило зависят от успешности выполнения предыдущих, то есть мы опять пришли к тому, что разработчик в праве проигнорировать код ошибки после чего причину последующих ошибок будет сложно установить
но я уже начал повторяться, мы идем по кругу smile

Цитата(djamshud @  30.11.2009,  11:23 Найти цитируемый пост)
Если вопрос касался детализации ошибки защищенного диска, то нужно добавить еще один тип ошибки. 

и еще один и еще, тебе говорит о чем-нибудь словосочетание "комбинаторный взрыв"? smile
если смотреть только на один уровень, скажем, на класс IO, то все почти OK, немного грязновато и все, но если у нас есть подсистема, в которой все это используется совместно, и нам нужно возвращать из нее коды ошибок, то вещи очень быстро перестают быть управляемыми
поясню на примере, представь, что у тебя есть ф-я main, это самый высокий уровень, из нее вызываются всякие ф-ии, методы классов, это более низкий уровень, каждый метов/ф-я этого уровня используют разные подсистемы, которые составляют системный уровень приложения - ввод/вывод, и так далее
так вот, все ошибки, которые не могут быть обработаны и должны привести к завершению приложения должны попасть в main, так? происходит какая-то ошибка на уровне системы, она не может быть обработана на том-же уровне, естественно, файл или сокет не в курсе, нужно-ли завершать приложение или нет, поэтому происходит раскрутка стека, ошибка идет на "средний" уровень, оказывается что она там то-же не может быть обработана, после чего она передается на самый высокий уровень и там происходит запись сообщения в лог и завершение работы.
Так вот, представь, о каком количестве кодов ошибок должен знать самый верхний уровень, в случае исключений, все просто, пишешь:
Код

int main()
{
...
    catch(std::exception const& e)
    {
        LOG_ERROR((e.what()));
        return -1;
    }
}

в общем, исключения улучшают модульность, клиентскому коду не нужно знать обо всем, что может произойти с объектом класса, исключения - полиморфны, поэтому зачастую можно просто игнорировать их тип, в большинстве случаев, для того, что-бы приложение корректно обработало ошибку, достаточно самого факта того, что исключение произошло. С кодами ошибок придется м****я тем больше, чем больше проект.
Ну еще стоит вспомнить win32 api, а точнее то, сколько ошибок возникает из-за неправильной проверки результатов выполнения той или иной ф-ии. К примеру, CreateFile может вернуть NULL или INVALID_HANDLE_VALUE, в разных случаях, при этом еще нужно получить код ошибки ф-ей GetLastError. 
PM MAIL Skype GTalk   Вверх
djamshud
Дата 30.11.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>и еще один и еще

Ну так новый тип исключения тоже нужно будет создавать.

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

На словах то оно все так и обстоит. Но на деле мои программы вообще никогда не обрабатывают ошибки в main или просто через большое количество вызовов.

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

>Ну еще стоит вспомнить win32 api

Вот это точно вспоминать не стоит. Я уже давно забыл и не жалею.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 30.11.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(djamshud @  30.11.2009,  14:34 Найти цитируемый пост)
Ну так новый тип исключения тоже нужно будет создавать.

даже если так, исключения полиморфны, а коды ошибок нет(если речь идет не о чем-нибудь вроде boost::system)

Цитата(djamshud @  30.11.2009,  14:34 Найти цитируемый пост)
На словах то оно все так и обстоит. Но на деле мои программы вообще никогда не обрабатывают ошибки в main или просто через большое количество вызовов.

Цитата(djamshud @  30.11.2009,  14:34 Найти цитируемый пост)
В общем то вопрос у нас уперся в принципиально разные подходы к проектированию ПО.

видимо, наши программы решают сильно разные по сложности задачи smile

Цитата(djamshud @  30.11.2009,  14:34 Найти цитируемый пост)
ИМХО продолжать полемику (в ключе эксепшин VS код возврата) дальше нет смысла. Как обычно в холиворах стороны высказали все свои доводы, но каждый остался при своем.

ОК, мне уже надоело раз за разом повторять прописные истины smile 
PM MAIL Skype GTalk   Вверх
djamshud
Дата 30.11.2009, 14:53 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>видимо, наши программы решают сильно разные по сложности задачи

Ох, сколько высокомерия, мой уважаемый, опытный и толстый собеседникsmile.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
bsa
Дата 30.11.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



djamshud, просто вызывают сомнения твои высказывания по поводу работы с большими проектами, так как у тебя глаза разбегаются от форматирования. А без него совершенно невозможно анализировать код, имеющий более одного уровня вложенности блоков - осознание необходимости форматирования приходит новичкам не позже, чем через пару месяцев, после начала практического освоения языка.
PM   Вверх
djamshud
Дата 30.11.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

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



>без него совершенно невозможно анализировать код

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

>вызывают сомнения твои высказывания по поводу работы с большими проектами

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
maxxant
Дата 30.11.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Lazin @  30.11.2009,  06:44 Найти цитируемый пост)
не вижу поводов для язвительности, лично я считают GUI программистов низшей кастой  


я искренне.

PS: про гуи да, нелюблю, и почти не занимаюсь им тож. другое дело драйверок пол линух написать (жаль тока на сях), или демон какой нить.
PM MAIL   Вверх
lom2k
Дата 6.3.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну и нафлудили smile

Использовать или не использовать ++ exceptions дело сугубо личное.

Я например не использую, хотя пишу на плюсах.

Причины: 

1. раскрутка стека при исключениях операция недешевая в сравнении с обычным кодом возврата
2. по мне лучше использовать функцию инициализации объекта с кодом возврата, чем исключение в конструкторе
3. понимание кода if {} else {} проще чем многоуровневые try {} except {} finally {}
4. переносимость

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


PM MAIL   Вверх
Любитель
Дата 9.3.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)

что в этом плохого, я весь вечер этого и добиваюсь smile  

Lazin, раз тема ещё (оказывается!) жива и я её увидел - ты этого добился..
Холиварам место в холиварах (хотя такое уже и было..).


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


Эксперт
****


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

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



Цитата(lom2k @  6.3.2010,  16:09 Найти цитируемый пост)
Ну и нафлудили 

Использовать или не использовать ++ exceptions дело сугубо личное.

Я например не использую, хотя пишу на плюсах.

Причины: 

1. раскрутка стека при исключениях операция недешевая в сравнении с обычным кодом возврата
2. по мне лучше использовать функцию инициализации объекта с кодом возврата, чем исключение в конструкторе
3. понимание кода if {} else {} проще чем многоуровневые try {} except {} finally {}
4. переносимость

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


я уже один раз нафлудил, а вы хотите, что-бы я еще раз нафлудил? еще чего!

Цитата(Любитель @  9.3.2010,  01:02 Найти цитируемый пост)
ты этого добился..

пойду, открою бутылку шампанского smile 
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




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


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

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