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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Падение программы при выбрасывании исключения в eventFilter  (Прочитано 3365 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Июль 06, 2016, 09:09 »

Есть MainWindow у которого в переопределенном методе eventFilter происходит выбрасывание исключения и он падает с ошибкой "Invalid parameter passed to C runtime function.". Обработка исключений есть:

Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   try {
       MainWindow w;
       w.show();
 
       return a.exec();
 
   } catch (const std::exception& e) {
       QString text = QString("ERROR: %1.").arg(e.what());
       QMessageBox::critical(NULL, QString(), text);
       qCritical() << text;
       a.quit();
       return 1;
   }
}
 

Если выбросить исключение в конструкторе MainWindow, то оно отлавливается, что говорит о том, что это заморочка Qt.


Хотелось бы узнать какие-нибудь варианты как с этим жить Улыбающийся
« Последнее редактирование: Июль 06, 2016, 09:16 от gil9red » Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июль 06, 2016, 09:29 »

Если выбросить исключение в конструкторе MainWindow, то оно отлавливается, что говорит о том, что это заморочка Qt.
Стройный логический вывод  Улыбающийся А мне вот вообще неясно как исключение должно сработать в событийной (event-driven) схеме. Ну вот пришло событие от OC, наш код его отрабатывает и бросает исключение. Что должно произойти? Как должен "откатиться" код ОС (и должен ли) и откуда уверенность что весь стек вызовов на руках?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #2 : Июль 06, 2016, 10:24 »

Если выбросить исключение в конструкторе MainWindow, то оно отлавливается, что говорит о том, что это заморочка Qt.
Стройный логический вывод  Улыбающийся А мне вот вообще неясно как исключение должно сработать в событийной (event-driven) схеме. Ну вот пришло событие от OC, наш код его отрабатывает и бросает исключение. Что должно произойти? Как должен "откатиться" код ОС (и должен ли) и откуда уверенность что весь стек вызовов на руках?

Все (почти) исключения проходят через QApplication::notify и не должны его покидать (кроме случаев последующего терминейта программы).
Другое дело, что не везде в Qt обработка исключений сделана правильно (например, в контейнерах - нет)
Записан
Bepec
Гость
« Ответ #3 : Июль 06, 2016, 10:42 »

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

По сути, отказывайтесь или от исключений, или от Qt Веселый
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Июль 06, 2016, 11:58 »

Спасибо за реакцию Улыбающийся
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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