crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Qt Exceptions, Использование исключений в Qt 4.7.0
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.

Спасибо за помощь !
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Авварон
  опции профиля:
сообщение 2.10.2010, 23:05
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 99
Регистрация: 26.4.2009
Пользователь №: 709

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




Репутация:   0  


Мне казалось, что эксепшны ловятся в цикле событий и там и помирают.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JuryS1806
  опции профиля:
сообщение 2.10.2010, 23:10
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Авварон @ 3.10.2010, 0:05) *
Мне казалось, что эксепшны ловятся в цикле событий и там и помирают.

Они генерируются где угодно и потом начинают передаваться выше, до тех пор пока кто-нибудь их не отработает. К примеру, я даже в вызове какого-то класса заколочу try и как результат, в случае возникновения ошибки поймаю его.

Вещь конечно тормознутая, но незаменимая.

Я сейчас пересобрал проект с ключом DEFINES += No_Exception.

Не знаю как. но Qt его съел и теперь программа вылетает, также игнорирует catch (...) в функции main(), но теперь сам Qt ничего не пишет, просто мол приложение завершено с кодом 0. И при этом exception'ы функций работают исправно.

Все это подозрительно очень. Я думаю это баг QApplication.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2010, 6:39
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2928
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


[offtop]
JuryS1806, goto - зло! А если уж используешь, пользуйся правильно
Runagain:
       try
       {
               app.exec();
       }
       catch (...)
       {
           QMessageBox::critical(0,msgHead,QString::fromUtf8("<b>Неизвестная ошибка.</b>")+runagainMsg);
        }

   goto Runagain;
   return 0;


[/offtop]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JuryS1806
  опции профиля:
сообщение 3.10.2010, 9:55
Сообщение #5


Студент
*

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

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




Репутация:   0  


Да хоть бы QMessageBox отработал, а то вылет и все тут. Я кстати говоря 4.6.0, 4.6.2, 4.6.3 перепробовал и везде одно и то же. И при том что судя по всему проблема не в Qt а в Linux. Под Windows это срабатывает изумительно. А под ubuntu нет.
Вот и не пойму в чем дело...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 4.10.2010, 14:24
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

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




Репутация:   7  


А под Linux эксепшены не канают. Забудьте про них вообще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 4.10.2010, 14:42
Сообщение #7


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

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

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




Репутация:   23  


Цитата(kuzulis @ 4.10.2010, 15:24) *
А под Linux эксепшены не канают. Забудьте про них вообще.

???
а по подробнее можешь растолковать?

JuryS1806,
может исключения перехватываются до main() и в отсутствии корректной реакции вызывают крах программы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 4.10.2010, 15:12
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

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




Репутация:   7  


Цитата
???
а по подробнее можешь растолковать?

Да я в подробности не вдавался, но по слухам в Linux лучше проверять возвращаемые значения.
Да и везде где я видел код для Linux, я нигде (или оч редко) видел обработку исключений..

А вообще, почитать тут можно кое что (примерчик): http://www.visualdata.ru/blog/109-segv-signal.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 4.10.2010, 15:19
Сообщение #9


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

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

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




Репутация:   23  


Цитата(kuzulis @ 4.10.2010, 16:12) *
Да я в подробности не вдавался, но по слухам в Linux лучше проверять возвращаемые значения.

ну товарищ это не серьезно. :(
если ты сам генерируешь способ сообщения об ошибке, мало кому интересно как это у тебя будет возвращаемое значение или исключение. однако есть стандартные средства(stl к примеру), которые уже генерируют исключения и обрабатывать их надо.
чем таким принципиальным функция линукс версия std::vector<Type>::at(int) отличается от виндовой версии?
и там и там будет исключение std::out_of_range в случае выхода за пределы вектора.

как собираешься сообщить об ошибке в конструкторе через возвращаемое значение?

П.С.
в статье нет ни слова про возвращаемые значения в случае ошибок.
ключевая мысль статьи
Цитата
В данном примере рассмотрен вариант трансляции системных сигналов SIGSEGV и SIGFPE в стандартные исключения языка c++ для i386/gcc/linux.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 4.10.2010, 15:27
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

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




Репутация:   7  


Цитата
как собираешься сообщить об ошибке в конструкторе через возвращаемое значение?

Хм.. Похожая тема и на prog.org.ru была. И там были примеры с исключениями в этом случае (и даже я тему создавал там такую) :)

Но я бы проверил бы величину значения int и выставил бы в конструкторе какой-то флаг типа bool valid = false или еще как... И уже далее перед выполнением каких нибудь методов (тот.же .at(int)), я бы делал проверку на этот флаг и , соответственно, дальше уже бы решал что делать.
--
т.е. у меня "парадигма" - всегда контролровать свои переменные принаписании кода, а не полагаться на исключения.

ЗЫ:
нашел тему: http://www.prog.org.ru/topic_13051_0.html

Сообщение отредактировал kuzulis - 4.10.2010, 15:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.9.2021, 3:03