Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

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

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


 




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


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

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