crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

JuryS1806
  опции профиля:
сообщение 2.10.2010, 21:38
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 93
Регистрация: 21.10.2009
Из: Нижний Новгород
Пользователь №: 1168

Спасибо сказали: 9 раз(а)




Репутация:   0  


Здраствуйте, товарищи.

Столкнулся с такой проблемой. Сегодня установил Qt 4.7.0.

и теперь не могу отлавливать Exception'ы в main.
В общем это выглядит так:

Runagain:
            try
        {
                app.exec();
        }
                catch (...)
                  {
                    QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Неизвестная ошибка.</b>")+runagainMsg);
                    goto Runagain;
                  }
    return 0;

И до версии 4.6.3 это срабатывало, но теперь нет, при том что exception'ы отлавливаются в любых функциях и классах, но вот не в main. Просто наработал столько, что сейчас во всех классах и методах прописывать try -> catch . Да и не нужно. Только вот бывают критические ошибки и хотелось бы их отловить в main.

Спасибо за помощь !
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
kwisp
  опции профиля:
сообщение 4.10.2010, 15:48
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(kuzulis @ 4.10.2010, 16:41) *
Да это просто вброс в стиле ЛОР-а :)

ну спасибо! :)
к чему катимся, товарищи?
давай договоримся не писать подобных ЛОР-сообщений.

П.С.
за ссылку спасибо, оч. интересно, как раз вплотную с этой проблемой столкнулся.
даешь разумную обработку ошибок!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JuryS1806
  опции профиля:
сообщение 14.10.2010, 2:20
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 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'ы распихал по программе... Тестирую, ищу где мог пропустить....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- JuryS1806   Qt Exceptions   2.10.2010, 21:38
- - Авварон   Мне казалось, что эксепшны ловятся в цикле событий...   2.10.2010, 23:05
|- - JuryS1806   Цитата(Авварон @ 3.10.2010, 0:05) Мне каз...   2.10.2010, 23:10
- - Алексей1153   JuryS1806, goto - зло! А если уж используешь,...   3.10.2010, 6:39
|- - JuryS1806   Да хоть бы QMessageBox отработал, а то вылет и все...   3.10.2010, 9:55
- - kuzulis   А под Linux эксепшены не канают. Забудьте про них ...   4.10.2010, 14:24
- - kwisp   Цитата(kuzulis @ 4.10.2010, 15:24) А под ...   4.10.2010, 14:42
- - kuzulis   Цитата??? а по подробнее можешь растолковать? Да я...   4.10.2010, 15:12
- - kwisp   Цитата(kuzulis @ 4.10.2010, 16:12) Да я в...   4.10.2010, 15:19
- - kuzulis   Цитатакак собираешься сообщить об ошибке в констру...   4.10.2010, 15:27
- - kwisp   Цитата(kuzulis @ 4.10.2010, 16:27) Но я б...   4.10.2010, 15:34
- - kuzulis   Цитатаиз чего это следует? Да это просто вброс в с...   4.10.2010, 15:41
- - kwisp   Цитата(kuzulis @ 4.10.2010, 16:41) Да это...   4.10.2010, 15:48
|- - JuryS1806   Спасибо за Ваше активное участие в теме ! К с...   14.10.2010, 2:20
- - Алексей1153   JuryS1806, так и выходишь из catch при помощи goto...   14.10.2010, 6:38
|- - JuryS1806   Сейчас опробую ! Кстати, насчет необходимости ...   15.10.2010, 0:46
- - Алексей1153   Цитата(JuryS1806 @ 15.10.2010, 3:46) Qt п...   15.10.2010, 6:40
- - JuryS1806   да уж   15.10.2010, 23:29


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 27.6.2025, 23:35