Russian Qt Forum

Qt => Общие вопросы => Тема начата: ig от Октябрь 30, 2007, 07:11



Название: Обработка исключений в слоте
Отправлено: ig от Октябрь 30, 2007, 07:11
Пусть у нас есть два класса.
Сигнал одного класса связан со слотом другого класса.
Если произвести отправку сигнала и генерацию исключения в слоте, то это исключение невозможно будет перехватить. Даже с помощью catch (...). Программа ОБЯЗАТЕЛЬНО завершится аварийно.
Причем, данное обстоятельство справедливо только для Release-варианта установки Qt. Если Qt установлена с отладочной информацией (debug), то все работает правильно, исключение перехватывается.
Проверялось на разных системах (Linux) с разными компиляторами.
Кто сталквался с таким или может попробовать у себя (любой тривиальный пример)?


Название: Re: Обработка исключений в слоте
Отправлено: Alex03 от Октябрь 30, 2007, 07:37
При создании release версии, ключик -no-exceptions не указывался в configure?


Название: Re: Обработка исключений в слоте
Отправлено: ig от Октябрь 30, 2007, 07:54
Кстати, судя по всему, его указывают. Интересно, а зачем?
Например, http://www.sisyphus.ru/srpm/qt3/spec


Название: Re: Обработка исключений в слоте
Отправлено: pastor от Октябрь 30, 2007, 10:11
Это всем известная проблема:

http://lists.trolltech.com/qt-interest/2006-02/thread00862-0.html


Название: Re: Обработка исключений в слоте
Отправлено: Tonal от Октябрь 30, 2007, 12:26
Код:
qt4.3.1\src\corelib\Makefile.Release:
CXXFLAGS      = -O3 -march=pentium3 -mtune=pentium3 -Wall -frtti -fexceptions -mthreads $(DEFINES)

Ну -march=pentium3 -mtune=pentium3 эт я сам в mkspecs добавил, а остальное само подставилось...
К чему бы это?

Да, если внимательно посмотреть справку по configure, можно найти:
Код:
    -no-exceptions ..... Disable exceptions on platforms that support it.
 *  -exceptions ........ Enable exceptions on platforms that support it.
...
    -no-rtti ........... Do not compile runtime type information.
 *  -rtti .............. Compile runtime type information.


Название: Re: Обработка исключений в слоте
Отправлено: Alex03 от Октябрь 31, 2007, 11:44
Кстати, судя по всему, его указывают. Интересно, а зачем?
4-ку и под виндой не пробовал а вот размер либы qt 3.x.x под линуксом с -no-exceptions раза в полтора меньше.

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


Название: Re: Обработка исключений в слоте
Отправлено: Tonal от Октябрь 31, 2007, 13:22
А я бы не стал отказываться от исключений, без очень серьёзных причин (наример компилятор/ос не поддерживает)


Название: Re: Обработка исключений в слоте
Отправлено: pastor от Октябрь 31, 2007, 16:26
В Qt я никогда не использовал испускание исключений, да и смысла и везких причин я особого невижу


Название: Re: Обработка исключений в слоте
Отправлено: Вячеслав от Октябрь 31, 2007, 18:58
Смысл есть - чтоб каждый раз не проверять коды возврата из компонентов ;)

IMHO цепочка if'оф смотриться более громозко и нечитабельно чем try-catch....
Просто в Qt  надо еще пару телодвижений сделать - не забыть , сделать по варнингу ;)
Цитировать
"Qt has caught an exception thrown from an event handler. Throwing\n"
 "exceptions from an event handler is not supported in Qt. You must\n"
 "reimplement QApplication::notify() and catch all exceptions there.\n"
Чтоб приложение тихо не падало при появлении неучтенного исключения , и продумывать архитектуру приложения ;)