Russian Qt Forum

Qt => Общие вопросы => Тема начата: avpog от Сентябрь 24, 2007, 13:34



Название: Исключения в QT
Отправлено: avpog от Сентябрь 24, 2007, 13:34
Всем привет!
Совсем недавно занимаюсь QT, а посему вопрос может несколько ламерский.
Подскажите пожалуйста, как в QT применять обработку программных исключений?
Если можно, маенький пример.
По поиску прошелся, пару тем нашел, но низкоинформативных.
В литературе по QT тоже не обнаружил к сожалению.
Спасибо.


Название: Re: Исключения в QT
Отправлено: Вячеслав от Сентябрь 24, 2007, 16:29
сама QT не использует исключения (exceptions) ... А в своей программе - как обычно ;)

try {} catch(...) {} ;)


Название: Re: Исключения в QT
Отправлено: pastor от Сентябрь 24, 2007, 18:25
2 Вячеслав:

Qt 3.х действительно не использует exceptions, но Qt 4.x использует их. Из своего горького опыта добавлю, что не рекомендуеться конфигурировать Qt 4 БЕЗ поддержки exeptions (флаг  -no-exceptions)


Название: Re: Исключения в QT
Отправлено: Пантер от Сентябрь 24, 2007, 18:34
А что будет? Я всегда конфигурирую с -no-exceptions и пока ничего странного не происходило, а то, что происходило, только из-за кривых руг и прямых извилин. :)


Название: Re: Исключения в QT
Отправлено: pastor от Сентябрь 24, 2007, 18:46
А что будет? Я всегда конфигурирую с -no-exceptions и пока ничего странного не происходило, а то, что происходило, только из-за кривых руг и прямых извилин. :)

Работали как-то мы над одним проектом... У меня и у напарника Qt была сконфигурирована без их поддержки, у кустомера - с поддержкой. Так вот, когда началась отладка приложения, у кусомера прога падала, у нас нет. После пересборки Qt с флагом -exceptions нам удалось отловить краш. Баг в проекте реально был! С флагом -no-exceptions Qt маскировала эту проблему. А это не есть гуд!


Название: Re: Исключения в QT
Отправлено: Пантер от Сентябрь 24, 2007, 18:48
Век живи - век учись. ;)
Пошел переконфигурировать кутю. :)


Название: Re: Исключения в QT
Отправлено: avpog от Сентябрь 24, 2007, 19:08
ОК, спасибо всем. Очень хорошее обсуждение получилось, как-то по местам все расставилось. Буду пробовать.  :)


Название: Re: Исключения в QT
Отправлено: Вячеслав от Сентябрь 24, 2007, 19:13
2 Вячеслав:

Qt 3.х действительно не использует exceptions, но Qt 4.x использует их. Из своего горького опыта добавлю, что не рекомендуеться конфигурировать Qt 4 БЕЗ поддержки exeptions (флаг  -no-exceptions)
А можно пальцем показать _где_ QT использует exceptionы? Я нашел только конструкции вида
try{}catch(...){ throw;} IMHO это не использует , а обрабатывает ...


Название: Re: Исключения в QT
Отправлено: pastor от Сентябрь 24, 2007, 19:54
Спасибо за паправку. Это я и имелл ввиду. Библиотека Qt 4 не генерирует (throw) исключения, а лишь их обрабатывает. Думаю так будет всем понятно :)


Название: Re: Исключения в QT
Отправлено: Danila_Bagrofff от Август 22, 2011, 11:13
Народ, а можно поподробнее про исключения. С примерами, если можно. В кути впервые появилась необходимость.
В с# с этим намного проще.
Тута что-то никак не понимаю. Как его организовывать. Как активировать.
И какой все-таки нужно и лучше использовать.
Насколько понял есть эксепшены кутишные и есть плюсовые.
В моем случае, видимо надо использовать кутишные, так как проблема у меня на уровне потоков и моделей кути. Соответвенно крахи надо отлавливать над кутишными моделями. Ставил Qt 4.7.0 которая идет в сборке с креатором.

В кэш.файле про эксепшены ни слова. Это значит, они не активированы? Или по умолчанию они все-таки есть?
Цитировать
-debug-and-release
-confirm-license
-plugin-sql-sqlite
-plugin-sql-odbc
-qt-libpng
-qt-libjpeg
-openssl
-opensource
-no-incredibuild-xge
-dont-process

Что и как пересобрать, если все-таки надо активировать. Или можно обойтись и плюсовыми эксепшнами?
Что надо инклюдить, чтобы использовать плюсовый exeption?
Может, есть какой-то мануал, но что-то не нашел...


Название: Re: Исключения в QT
Отправлено: lit-uriy от Август 22, 2011, 11:52
>>Насколько понял есть эксепшены кутишные и есть плюсовые.
Этот ты из предыдущего поста понял?
...Библиотека Qt 4 не генерирует (throw) исключения, а лишь их обрабатывает. Думаю так будет всем понятно :)



Название: Re: Исключения в QT
Отправлено: Danila_Bagrofff от Август 22, 2011, 12:09
угумс...

понял, почему я не нашел про экспешны.. они в в QTConcurent находятся...

нашел доку...

http://doc.crossplatform.ru/qt/4.7.x/qtconcurrent-exception.html#details

Это для других, на всякий. Сейчас пробую прикрутить..

Хотя никак не пойму, отрабатываются ли экспешны такого формата:

Код:
void MyClass::myFunc()
{
try{
//здесь что-то там делается
}
catch(...) {
//здесь что-то должно делаться в случае ошибок
}

}

Сейчас еще попробую кутэшный подставить класс, только не вижу, что он может дать особенного?...

Вот вопрос, будут ли генериться какие-то исключения, если где-то как-то не так обрабатывается. В моем случае через потоки обновляются модели. В основном используются кутешные объекты. Исключения они будут выдавать только в случае, если кути была собрана с флагом -exeptions?
Иначе исключения отлавливать и смысла нет?


Название: Re: Исключения в QT
Отправлено: Prm от Август 23, 2011, 13:31
Еще отлов исключений зависит от используемого MinGW. Он должен быть собран с ключом --enable-sjlj-exceptions. Я использую http://tdm-gcc.tdragon.net/ (http://tdm-gcc.tdragon.net/).

Раньше тож вопрос про исключения поднимал: http://www.prog.org.ru/topic_16956_0.html (http://www.prog.org.ru/topic_16956_0.html)


Название: Re: Исключения в QT
Отправлено: niXman от Август 28, 2011, 02:17
Еще отлов исключений зависит от используемого MinGW. Он должен быть собран с ключом --enable-sjlj-exceptions. Я использую
наглая ложь

используйте http://code.google.com/p/mingw-builds/downloads/list


Название: Re: Исключения в QT
Отправлено: Prm от Август 30, 2011, 20:52
наглая ложь

используйте http://code.google.com/p/mingw-builds/downloads/list

Во-первых, выбирай выражения. Во-вторых, удосужился бы посмотреть с какими флагами собран gcc в предлагаемом для скачивания архиве!


Название: Re: Исключения в QT
Отправлено: niXman от Август 31, 2011, 05:30
Цитировать
Во-первых, выбирай выражения.
насрать ;)

Цитировать
Во-вторых, удосужился бы посмотреть с какими флагами собран gcc в предлагаемом для скачивания архиве!
во первых - снова лжешь!
во вторых - кликаешь на любой архив и списка, и смотришь опции configure.
в третьих - исключения обрабатываются вне зависимости от этих ключей.
в четвертых - для чего пустозвонишь?


Название: Re: Исключения в QT
Отправлено: Prm от Август 31, 2011, 07:22
во вторых - кликаешь на любой архив и списка, и смотришь опции configure.

Кликаю в архив http://code.google.com/p/mingw-builds/downloads/detail?name=mingw32-gcc-4.6.2-prerelease-20110826.7z&can=2&q= (http://code.google.com/p/mingw-builds/downloads/detail?name=mingw32-gcc-4.6.2-prerelease-20110826.7z&can=2&q=) -  вижу ключ --enable-sjlj-exceptions.

в третьих - исключения обрабатываются вне зависимости от этих ключей.

Ну так собери свою сборку без этого ключа и скомпилируй тестовый пример для винды(выкладывал на форуме). Докажи, что я лгу.



Название: Re: Исключения в QT
Отправлено: niXman от Август 31, 2011, 09:22
Цитировать
Кликаю в архив http://code.google.com/p/mingw-builds/downloads/detail?name=mingw32-gcc-4.6.2-prerelease-20110826.7z&can=2&q= -  вижу ключ --enable-sjlj-exceptions.
еще бы. я его вписывал ;)

Цитировать
Докажи, что я лгу
гугление по теме, и чтение манов тебе докажет то, чего ты сам не понял. я-то все доказал.


Название: Re: Исключения в QT
Отправлено: navrocky от Август 31, 2011, 10:06
не понимаю из-за чего весь сыр-бор. в линуксах с гоцаце и в винде при использовании sdk (msvc, mingw) у меня исключения работают из коробки как полагается.


Название: Re: Исключения в QT
Отправлено: niXman от Август 31, 2011, 13:01
сыр-бор из-за того, что товарысчь Prm не понимает, что исключения это языковое средство. так же, не понимает, что нельзя собрать с++ компилятор без поддержки исключений. и не понимает смысл ключа --enable-sjlj-exceptions. но зато пустозвонит за троих.


Название: Re: Исключения в QT
Отправлено: navrocky от Август 31, 2011, 23:35
А если по теме, то для того чтобы обрабатывать исключения в гуёвой кутэшной программе, надо оверрайднуть метод QApplication::notify.

Код
C++ (Qt)
bool MyApplication::notify ( QObject * o, QEvent * e )
{
   bool res = false;
   try
   {
       res = QApplication::notify(o, e);
   }
   catch(...)
   {
       QMessageBox::error(activeWindow(), tr("Error"), tr("Unhandled exception"), QMessageBox::Ok, QMessageBox::Ok);
   }
   return res;
}