![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
JuryS1806 |
![]()
Сообщение
#1
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Здраствуйте, товарищи.
Столкнулся с такой проблемой. Сегодня установил Qt 4.7.0. и теперь не могу отлавливать Exception'ы в main. В общем это выглядит так:
И до версии 4.6.3 это срабатывало, но теперь нет, при том что exception'ы отлавливаются в любых функциях и классах, но вот не в main. Просто наработал столько, что сейчас во всех классах и методах прописывать try -> catch . Да и не нужно. Только вот бывают критические ошибки и хотелось бы их отловить в main. Спасибо за помощь ! |
|
|
![]() |
Авварон |
![]()
Сообщение
#2
|
![]() Студент ![]() Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: ![]() ![]() ![]() |
Мне казалось, что эксепшны ловятся в цикле событий и там и помирают.
|
|
|
JuryS1806 |
![]()
Сообщение
#3
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Мне казалось, что эксепшны ловятся в цикле событий и там и помирают. Они генерируются где угодно и потом начинают передаваться выше, до тех пор пока кто-нибудь их не отработает. К примеру, я даже в вызове какого-то класса заколочу try и как результат, в случае возникновения ошибки поймаю его. Вещь конечно тормознутая, но незаменимая. Я сейчас пересобрал проект с ключом DEFINES += No_Exception. Не знаю как. но Qt его съел и теперь программа вылетает, также игнорирует catch (...) в функции main(), но теперь сам Qt ничего не пишет, просто мол приложение завершено с кодом 0. И при этом exception'ы функций работают исправно. Все это подозрительно очень. Я думаю это баг QApplication. |
|
|
Алексей1153 |
![]()
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
[offtop]
JuryS1806, goto - зло! А если уж используешь, пользуйся правильно
[/offtop] |
|
|
JuryS1806 |
![]()
Сообщение
#5
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Да хоть бы QMessageBox отработал, а то вылет и все тут. Я кстати говоря 4.6.0, 4.6.2, 4.6.3 перепробовал и везде одно и то же. И при том что судя по всему проблема не в Qt а в Linux. Под Windows это срабатывает изумительно. А под ubuntu нет.
Вот и не пойму в чем дело... |
|
|
kuzulis |
![]()
Сообщение
#6
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: ![]() ![]() ![]() |
А под Linux эксепшены не канают. Забудьте про них вообще.
|
|
|
kwisp |
![]()
Сообщение
#7
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
kuzulis |
![]()
Сообщение
#8
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: ![]() ![]() ![]() |
Цитата ??? а по подробнее можешь растолковать? Да я в подробности не вдавался, но по слухам в Linux лучше проверять возвращаемые значения. Да и везде где я видел код для Linux, я нигде (или оч редко) видел обработку исключений.. А вообще, почитать тут можно кое что (примерчик): http://www.visualdata.ru/blog/109-segv-signal.html |
|
|
kwisp |
![]()
Сообщение
#9
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Да я в подробности не вдавался, но по слухам в Linux лучше проверять возвращаемые значения. ну товарищ это не серьезно. ![]() если ты сам генерируешь способ сообщения об ошибке, мало кому интересно как это у тебя будет возвращаемое значение или исключение. однако есть стандартные средства(stl к примеру), которые уже генерируют исключения и обрабатывать их надо. чем таким принципиальным функция линукс версия std::vector<Type>::at(int) отличается от виндовой версии? и там и там будет исключение std::out_of_range в случае выхода за пределы вектора. как собираешься сообщить об ошибке в конструкторе через возвращаемое значение? П.С. в статье нет ни слова про возвращаемые значения в случае ошибок. ключевая мысль статьи Цитата В данном примере рассмотрен вариант трансляции системных сигналов SIGSEGV и SIGFPE в стандартные исключения языка c++ для i386/gcc/linux. |
|
|
kuzulis |
![]()
Сообщение
#10
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: ![]() ![]() ![]() |
Цитата как собираешься сообщить об ошибке в конструкторе через возвращаемое значение? Хм.. Похожая тема и на prog.org.ru была. И там были примеры с исключениями в этом случае (и даже я тему создавал там такую) ![]() Но я бы проверил бы величину значения int и выставил бы в конструкторе какой-то флаг типа bool valid = false или еще как... И уже далее перед выполнением каких нибудь методов (тот.же .at(int)), я бы делал проверку на этот флаг и , соответственно, дальше уже бы решал что делать. -- т.е. у меня "парадигма" - всегда контролровать свои переменные принаписании кода, а не полагаться на исключения. ЗЫ: нашел тему: http://www.prog.org.ru/topic_13051_0.html Сообщение отредактировал kuzulis - 4.10.2010, 15:30 |
|
|
kwisp |
![]()
Сообщение
#11
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Но я бы проверил бы величину значения int и выставил бы в конструкторе какой-то флаг типа bool valid = false или еще как... И уже далее перед выполнением каких нибудь методов (тот.же .at(int)), я бы делал проверку на этот флаг и , соответственно, дальше уже бы решал что делать. мда. ничего не скажешь. можно только удачи пожелать ![]() никак не пойму почему: А под Linux эксепшены не канают. Забудьте про них вообще. из чего это следует? всегда контролировать свои переменные при написании кода, а не полагаться на исключения. согласен целиком и полностью, полагаться на них не стоит. но они уже есть и о них в линуксе надо помнить. |
|
|
kuzulis |
![]()
Сообщение
#12
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: ![]() ![]() ![]() |
Цитата из чего это следует? Да это просто вброс в стиле ЛОР-а ![]() который не несет никакой информации в принципе. Это субъективное мое личное мнение на данный момент. |
|
|
kwisp |
![]()
Сообщение
#13
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
JuryS1806 |
![]()
Сообщение
#14
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо за Ваше активное участие в теме !
К сожалению, без эксцепшенов не обойтись и никакие тут int значения не помогут. Вот например я сейчас разбросал программу на 87 библиотек, каждая ~ весит по 2 Мб, половина из них OpenCascade. Так вот, чтобы передать int например из Foundation и проследить до самого верха, при этом одни и те же функции вызываются из разных классов и т.д. и т.п... Вообще, в Windows отрабатываются exception'ы и в main, в Linux везде, кроме main. Почему не знаю, но оставил и там и + добавил exception'ы везде где можно... А в общем код следующий: Раскрывающийся текст #include <QApplication> #include "mainwindow.h" #include "ExceptionHead.h" //void loadModules(QSplashScreen*) { } ; int main (int argc, char** argv) { QApplication app(argc, argv); /* QSplashScreen splash(QPixmap(":/Visual3D/Splash/Resurs/Load.png")); splash.show(); Q_INIT_RESOURCE(Visual3D); QLabel lbl("<H1><CENTER>Ready!</CENTER></H1>"); loadModules(&splash); splash.finish(&lbl); */ //QDir::setCurrent(QCoreApplication::applicationDirPath()); QString resdir; QString translatorPath; #ifdef WNT //Настройки для Windows const QString initdir = QCoreApplication::applicationDirPath(); resdir = initdir + "/src/Resource"; translatorPath = initdir+"/src/messages/Ru_ru.qm"; #else //Настройки для Linux resdir = "/opt/Visual3D/bin/src/Resource"; translatorPath = "/opt/Visual3D/bin/src/messages/Ru_ru.qm"; #endif qputenv("CSF_ResourcesDefaults",resdir.toAscii()); qputenv("CSF_PluginDefaults",resdir.toAscii()); QTranslator* translator = new QTranslator; // создаем переводчик translator->load(translatorPath); // загрузка файла qt_*.qm* app.installTranslator(translator); // устанока переводчика MainWindow* w = new MainWindow(); w->setWindowTitle(QString::fromUtf8("Графический редактор")); w->setWindowIcon(QPixmap(":/Visual3D/icons/Resurs/MainWindow.png")); QString myArgument = argv[1]; if (myArgument.isEmpty()) w->Init(); w->showMaximized(); if (!myArgument.isEmpty()) { if (!w->InitArguments(argv[1])) //Здесь будут открываться файлы и если будет исполнен макрос и он будет завершен //командой quit(), тогда будет установлено свойство MainWindow -> disable //и соответственно Exception'ы не будут отрабатываться. //Также exception'ы не будут отрабатываться при автозапуске макроса. { w->Init(); w->showMaximized(); } } if (w->isEnabled()) { QString msgHead = QString::fromUtf8("Критическая ошибка"); QString runagainMsg = QString::fromUtf8(" В процессе работы возникла критическая ошибка. " "Сейчас будет предпринята попытка восстановить " "рабочее состояние программы. " "В случае неудачи рабочие файлы будут автоматически " "открыты при следующем запуске программы."); Runagain: try { app.exec(); } catch (Standard_AbortiveTransaction) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 1. Прерванная транзакция.</b>")+runagainMsg); goto Runagain; } catch (Standard_ConstructionError) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 2. Ошибка построения.</b>")+runagainMsg); goto Runagain; } catch (Standard_DimensionMismatch) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 3. Несоответствие измерения.</b>")+runagainMsg); goto Runagain; } catch (Standard_DimensionError) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 4. Ошибка измерения.</b>")+runagainMsg); goto Runagain; } catch (Standard_DivideByZero) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 5. Деление на ноль.</b>")+runagainMsg); goto Runagain; } catch (Standard_NullObject) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 6. Нулевой объект.</b>")+runagainMsg); goto Runagain; } catch (Standard_ImmutableObject) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 7. Неизменный Объект.</b>")+runagainMsg); goto Runagain; } catch (Standard_MultiplyDefined) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 8. Повторный заголовок.</b>")+runagainMsg); goto Runagain; } catch (Standard_NegativeValue) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 9. Отрицательная величина.</b>")+runagainMsg); goto Runagain; } catch (Standard_NoMoreObject) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 10. Больше нет объектов.</b>")+runagainMsg); goto Runagain; } catch (Standard_NoSuchObject) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 11. Нет такого объекта.</b>")+runagainMsg); goto Runagain; } catch (Standard_NullValue) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 12. Нулевое значение.</b>")+runagainMsg); goto Runagain; } catch (Standard_OutOfRange) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 13. Вне диапазона.</b>")+runagainMsg); goto Runagain; } catch (Standard_RangeError) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 14. Ошибка диапазона.</b>")+runagainMsg); goto Runagain; } catch (Standard_TypeMismatch) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 15. Несоответствие типов.</b>")+runagainMsg); goto Runagain; } catch (Standard_DomainError) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 16. Ошибка области.</b>")+runagainMsg); goto Runagain; } catch (Standard_NotImplemented) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 17. Невозможно осуществить.</b>")+runagainMsg); goto Runagain; } catch (Standard_Overflow) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 18. Перегрузка.</b>")+runagainMsg); goto Runagain; } catch (Standard_Underflow) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 19. Недогрузка.</b>")+runagainMsg); goto Runagain; } catch (Standard_NumericError) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 20. Числовая ошибка.</b>")+runagainMsg); goto Runagain; } catch (Standard_OutOfMemory) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 21. Нехватает памяти.</b>")+runagainMsg); goto Runagain; } catch (Standard_ProgramError) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 22. Ошибка программы.</b>")+runagainMsg); goto Runagain; } catch (Standard_TooManyUsers) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 23. Слишком много пользователей.</b>")+runagainMsg); goto Runagain; } catch (...) { QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Неизвестная ошибка.</b>")+runagainMsg); goto Runagain; } } return 0; } и теперь все эти exception'ы распихал по программе... Тестирую, ищу где мог пропустить.... |
|
|
Алексей1153 |
![]()
Сообщение
#15
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
JuryS1806, так и выходишь из catch при помощи goto - потом не удивляйся неожиданным сюрпризам ))
вот кусок кода с try , без goto Раскрывающийся текст
|
|
|
JuryS1806 |
![]()
Сообщение
#16
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
Сейчас опробую !
Кстати, насчет необходимости exception'ов в принципе, а то раньше вопрос был типа нафиг они нужны и т.д. Я тут долго с одной вещью боролся и только с месяц назад победил. Приблизительно это выглядит так:
При том что Qt просто вылетал без всяких сообщений. Происходило это через раз... Например на двухядерных машинах 1/4, на P3 600 через раз. Но страшно то что не знаешь, выпадет Qt или нет... Так вот, думал что у меня руки кривые и пробовал по разному. В таком исполнении если в catch положить QMessageBox, то он будет кричать... и все работает. /не bool вызовы списка и индека, не processEvents здесь не помогали/ Еще в защиту exception'ов: считаю они просто необходимы, тем более при длительной и большой разработке, учитывая сложность. Думаю что никакими int значения не отследить exception'ы при расчете например треугольников Серпинского и прочей ереси ...Приветствую всех желающих заняться философией в этом топике ![]() |
|
|
Алексей1153 |
![]()
Сообщение
#17
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Qt просто вылетал наверное, не Qt, а программа ? Приветствую всех желающих заняться философией в этом топике философия, значит, такая: на эксепшены не надеяться. Всегда создавать условия, когда эксепшена быть не должно. Не заходить в блок try в цикле - будут тормоза (правда, всё зависит от назначения и количества итераций цикла). Большой цикл можно обернуть снаружи в try, если там, в принципе, может вылететь что-нибудь ![]() |
|
|
JuryS1806 |
![]()
Сообщение
#18
|
![]() Студент ![]() Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: ![]() ![]() ![]() |
да уж
Сообщение отредактировал JuryS1806 - 15.10.2010, 23:31 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 30.6.2025, 0:46 |