Russian Qt Forum
Ноябрь 27, 2024, 05:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: РЕШЕНО Перехват исключений в Qt 4.7.1  (Прочитано 12382 раз)
Prm
Гость
« : Февраль 26, 2011, 18:58 »

Долгое время использовали с напарником Qt 4.5.0 и MinGW c GCC 3.4.5. Недавно обновились до Qt 4.7.1 и MinGW c GCC 4.5.2. Появилась проблема. В проектах активно используем исключения. Теперь при генерации исключений ни один catch их не ловит. В чем может быть причина??? Поиск по форуму результатов не дал. Qt собрана с флагом -exceptions. Выручайте, други.
« Последнее редактирование: Март 01, 2011, 10:18 от Prm » Записан
Prm
Гость
« Ответ #1 : Февраль 27, 2011, 22:12 »

Неужели исключения так не популярны? Что, никто их не пользует???
Записан
alexman
Гость
« Ответ #2 : Февраль 27, 2011, 22:35 »

Их сами qt-ники используют крайне редко!
Записан
BRE
Гость
« Ответ #3 : Февраль 27, 2011, 22:48 »

Неужели исключения так не популярны? Что, никто их не пользует???
Ну ты же сам понимаешь, что ситуация не штатная.
Попробуй сделать маленький тестовый пример, который будет показывать проблему и выложи его. А все желающие попробуют у себя и скорее всего посоветуют какое-то решение.  Подмигивающий
Записан
Sancho_s_rancho
Гость
« Ответ #4 : Февраль 27, 2011, 22:52 »

Неужели исключения так не популярны? Что, никто их не пользует???
Хех. Меня учили не говорить "за всех", поэтому скажу только за себя.
Их использует Страуструп Улыбающийся
И об их преимуществах написано у него.
Типа:
1) Коды ошибок плохо, потому что при большой вложенности передавать их вверх неудобно. Вот исключения рулят. Там стек вызовов раскручивается и все в шохоладе.
2) Обработать код ошибки можно забыть. А неперехваченное исключение всегда даст о себе знать.
3) Это просто круто.
У меня немного другое мнение
1) Если вложенность большая - значит это как-то надо исправлять, т.к. или спроектирована программа хреново или просто она "повзрослела". В любом случае спагетти из исключений изящества не добавит.
2) Т.к. мне неизвестно определение "исключительной" ситуации, то и поделить все ситуации на рабочие и "исключительные" я не могу. Единственное. что приходит в голову  на тему "исключительности" - это когда оператор new память выделить не может.
3) Это не очень круто т.к. бинарник растет на треть(привет смартфонам) и добавляется немного тормозов. По версии Страуструпа - это из-за кривых компиляторов. Но ссылки на прямые компиляторы он не дает.
4)Раньше программисты использовали механизм исключений для посылки сообщений, но сейчас для этого есть механизмы сигнал-слот.
Записан
Prm
Гость
« Ответ #5 : Февраль 27, 2011, 23:37 »

Ожила тема  Улыбающийся Во вложении простейший пример генерации исключения.

Применять исключения или нет - дело каждого. Вопрос сейчас не в этом. Основной вопрос - почему qt4.7.1 не может отловить исключение.
Записан
BRE
Гость
« Ответ #6 : Февраль 27, 2011, 23:44 »

У меня все нормально.
Получил в консоль:
Цитировать
Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt. You must
reimplement QApplication::notify() and catch all exceptions there.
и получил QMessageBox:
Цитировать
Exception catched!!!

[...]$ gcc --version
gcc (GCC) 4.5.2 20110127 (prerelease)
Copyright (C) 2010 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.

[...]$ qmake --version
QMake version 2.01a
Using Qt version 4.7.1 in /usr/lib
Записан
Prm
Гость
« Ответ #7 : Февраль 27, 2011, 23:50 »

Это уже интересно. В линуксе значит работает. Я собираю прогу под WinXP. Мои версии ПО:

Код:

C:\>qmake -v
QMake version 2.01a
Using Qt version 4.7.1 in D:/Soft/Qt/4.7.1/lib

C:\>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=d:/soft/mingw_4_5_2/bin/../libexec/gcc/mingw32/4.5.2/lto-wra
pper.exe
Target: mingw32
Configured with: ../gcc-4.5.2/configure --enable-languages=c,c++,ada,fortran,obj
c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo
mp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-r
untime-libs --disable-werror --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.5.2 (GCC)

Какие могут быть предположения???

« Последнее редактирование: Февраль 27, 2011, 23:55 от Prm » Записан
Prm
Гость
« Ответ #8 : Март 01, 2011, 07:26 »

Скомпилировал Qt 4.7.1 старым MinGW c gcc 3.4.5. Программа заработала, исключения ловятся. Ключи сборки MinGW:
Код:
d:\Soft\MinGW\bin>gcc -v
Using built-in specs.
Configured with: ../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --with-gnu-as
--host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls
--enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm
--disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: win32
gcc version 3.4.5 (mingw-vista special r3)

Если сравнивать две сборки MinGW, видим разницу в ключе --enable-sjlj-exceptions. Качнул за ночь MinGW 4.5.1, собранный с ключом --enable-sjlj-exceptions. В течении дня пересоберу Qt и попробую скомпилить прогу.

Записан
Prm
Гость
« Ответ #9 : Март 01, 2011, 10:17 »

Пересобрал Qt 4.7.1 MinGW gcc 4.5.1, перекомпилил прогу - все заработало как надо. Выдержка из readme к компилятору:

Код:
*** DW2 vs. SJLJ unwinding ***
GCC currently supports two methods of stack frame unwinding: Dwarf-2 (DW2) or
SJLJ (setjmp/longjmp). Until recently, only SJLJ has been available for the
Windows platform. This affects you, the end user, primarily in programs that
throw and catch exceptions. Programs which utilize the DW2 unwind method
generally execute more quickly than programs which utilize the SJLJ method,
because the DW2 method incurs no runtime overhead until an exception is thrown.
Записан
iukash
Гость
« Ответ #10 : Апрель 28, 2011, 13:05 »

А где скачать MinGW с ключом --enable-sjlj-exceptions? Дайте ссылку пожалуйста!
Записан
iukash
Гость
« Ответ #11 : Апрель 28, 2011, 21:53 »

Все, нашел, пошел Qt пересобирать!  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 21.