Qt Exceptions, Использование исключений в Qt 4.7.0 |
Здравствуйте, гость ( Вход | Регистрация )
Qt Exceptions, Использование исключений в Qt 4.7.0 |
kwisp |
4.10.2010, 15:34
Сообщение
#11
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
Но я бы проверил бы величину значения int и выставил бы в конструкторе какой-то флаг типа bool valid = false или еще как... И уже далее перед выполнением каких нибудь методов (тот.же .at(int)), я бы делал проверку на этот флаг и , соответственно, дальше уже бы решал что делать. мда. ничего не скажешь. можно только удачи пожелать без обид... никак не пойму почему: А под Linux эксепшены не канают. Забудьте про них вообще. из чего это следует? всегда контролировать свои переменные при написании кода, а не полагаться на исключения. согласен целиком и полностью, полагаться на них не стоит. но они уже есть и о них в линуксе надо помнить. |
|
|
kuzulis |
4.10.2010, 15:41
Сообщение
#12
|
Активный участник Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: 7 |
Цитата из чего это следует? Да это просто вброс в стиле ЛОР-а который не несет никакой информации в принципе. Это субъективное мое личное мнение на данный момент. |
|
|
kwisp |
4.10.2010, 15:48
Сообщение
#13
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
|
|
|
JuryS1806 |
14.10.2010, 2:20
Сообщение
#14
|
Студент Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: 0 |
Спасибо за Ваше активное участие в теме !
К сожалению, без эксцепшенов не обойтись и никакие тут 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 |
14.10.2010, 6:38
Сообщение
#15
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
JuryS1806, так и выходишь из catch при помощи goto - потом не удивляйся неожиданным сюрпризам ))
вот кусок кода с try , без goto Раскрывающийся текст
|
|
|
JuryS1806 |
15.10.2010, 0:46
Сообщение
#16
|
Студент Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: 0 |
Сейчас опробую !
Кстати, насчет необходимости exception'ов в принципе, а то раньше вопрос был типа нафиг они нужны и т.д. Я тут долго с одной вещью боролся и только с месяц назад победил. Приблизительно это выглядит так:
При том что Qt просто вылетал без всяких сообщений. Происходило это через раз... Например на двухядерных машинах 1/4, на P3 600 через раз. Но страшно то что не знаешь, выпадет Qt или нет... Так вот, думал что у меня руки кривые и пробовал по разному. В таком исполнении если в catch положить QMessageBox, то он будет кричать... и все работает. /не bool вызовы списка и индека, не processEvents здесь не помогали/ Еще в защиту exception'ов: считаю они просто необходимы, тем более при длительной и большой разработке, учитывая сложность. Думаю что никакими int значения не отследить exception'ы при расчете например треугольников Серпинского и прочей ереси ...Приветствую всех желающих заняться философией в этом топике |
|
|
Алексей1153 |
15.10.2010, 6:40
Сообщение
#17
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Qt просто вылетал наверное, не Qt, а программа ? Приветствую всех желающих заняться философией в этом топике философия, значит, такая: на эксепшены не надеяться. Всегда создавать условия, когда эксепшена быть не должно. Не заходить в блок try в цикле - будут тормоза (правда, всё зависит от назначения и количества итераций цикла). Большой цикл можно обернуть снаружи в try, если там, в принципе, может вылететь что-нибудь |
|
|
JuryS1806 |
15.10.2010, 23:29
Сообщение
#18
|
Студент Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: 0 |
да уж
Сообщение отредактировал JuryS1806 - 15.10.2010, 23:31 |
|
|
Текстовая версия | Сейчас: 5.12.2024, 6:52 |