Здраствуйте, товарищи.
Столкнулся с такой проблемой. Сегодня установил Qt 4.7.0.
и теперь не могу отлавливать Exception'ы в main.
В общем это выглядит так:
Runagain:
try
{
app.exec();
}
catch (...)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Неизвестная ошибка.</b>")+runagainMsg);
goto Runagain;
}
return 0;
Мне казалось, что эксепшны ловятся в цикле событий и там и помирают.
[offtop]
JuryS1806, goto - зло! А если уж используешь, пользуйся правильно
Runagain:
try
{
app.exec();
}
catch (...)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Неизвестная ошибка.</b>")+runagainMsg);
}
goto Runagain;
return 0;
Да хоть бы QMessageBox отработал, а то вылет и все тут. Я кстати говоря 4.6.0, 4.6.2, 4.6.3 перепробовал и везде одно и то же. И при том что судя по всему проблема не в Qt а в Linux. Под Windows это срабатывает изумительно. А под ubuntu нет.
Вот и не пойму в чем дело...
А под Linux эксепшены не канают. Забудьте про них вообще.
Спасибо за Ваше активное участие в теме !
К сожалению, без эксцепшенов не обойтись и никакие тут int значения не помогут.
Вот например я сейчас разбросал программу на 87 библиотек, каждая ~ весит по 2 Мб, половина из них OpenCascade.
Так вот, чтобы передать int например из Foundation и проследить до самого верха, при этом одни и те же функции вызываются из разных классов и т.д. и т.п...
Вообще, в Windows отрабатываются exception'ы и в main, в Linux везде, кроме main. Почему не знаю, но оставил и там и + добавил exception'ы везде где можно...
А в общем код следующий:
JuryS1806, так и выходишь из catch при помощи goto - потом не удивляйся неожиданным сюрпризам ))
вот кусок кода с try , без goto
while(1)
{
try
{
app.exec();
break;
}
catch (Standard_AbortiveTransaction)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 1. Прерванная транзакция.</b>")+runagainMsg);
}
catch (Standard_ConstructionError)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 2. Ошибка построения.</b>")+runagainMsg);
}
catch (Standard_DimensionMismatch)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 3. Несоответствие измерения.</b>")+runagainMsg);
}
catch (Standard_DimensionError)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 4. Ошибка измерения.</b>")+runagainMsg);
}
catch (Standard_DivideByZero)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 5. Деление на ноль.</b>")+runagainMsg);
}
catch (Standard_NullObject)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 6. Нулевой объект.</b>")+runagainMsg);
}
catch (Standard_ImmutableObject)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 7. Неизменный Объект.</b>")+runagainMsg);
}
catch (Standard_MultiplyDefined)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 8. Повторный заголовок.</b>")+runagainMsg);
}
catch (Standard_NegativeValue)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 9. Отрицательная величина.</b>")+runagainMsg);
}
catch (Standard_NoMoreObject)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 10. Больше нет объектов.</b>")+runagainMsg);
}
catch (Standard_NoSuchObject)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 11. Нет такого объекта.</b>")+runagainMsg);
}
catch (Standard_NullValue)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 12. Нулевое значение.</b>")+runagainMsg);
}
catch (Standard_OutOfRange)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 13. Вне диапазона.</b>")+runagainMsg);
}
catch (Standard_RangeError)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 14. Ошибка диапазона.</b>")+runagainMsg);
}
catch (Standard_TypeMismatch)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 15. Несоответствие типов.</b>")+runagainMsg);
}
catch (Standard_DomainError)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 16. Ошибка области.</b>")+runagainMsg);
}
catch (Standard_NotImplemented)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 17. Невозможно осуществить.</b>")+runagainMsg);
}
catch (Standard_Overflow)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 18. Перегрузка.</b>")+runagainMsg);
}
catch (Standard_Underflow)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 19. Недогрузка.</b>")+runagainMsg);
}
catch (Standard_NumericError)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 20. Числовая ошибка.</b>")+runagainMsg);
}
catch (Standard_OutOfMemory)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 21. Нехватает памяти.</b>")+runagainMsg);
}
catch (Standard_ProgramError)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 22. Ошибка программы.</b>")+runagainMsg);
}
catch (Standard_TooManyUsers)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Ошибка № 23. Слишком много пользователей.</b>")+runagainMsg);
}
catch (...)
{
QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Неизвестная ошибка.</b>")+runagainMsg);
}
}
Сейчас опробую !
Кстати, насчет необходимости exception'ов в принципе, а то раньше вопрос был типа нафиг они нужны и т.д.
Я тут долго с одной вещью боролся и только с месяц назад победил.
Приблизительно это выглядит так:
...
StMaterialSel = new QComboBox;
StMaterialSel->addItems(basemat->GetListOfMaterial());
connect(StMaterialSel, SIGNAL(currentIndexChanged(int)),
this, SLOT(setMyViewMaterial(int)));
int myIndex = basemat->GetVirtualIndex(index_m);
....
ComboNotReady:
try
{
StMaterialSel->setCurrentIndex(myIndex);
}
catch (...)
{
goto ComboNotReady;
}
......
да уж
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)