Russian Qt Forum

Qt => Общие вопросы => Тема начата: gil9red от Июль 06, 2016, 09:09



Название: Падение программы при выбрасывании исключения в eventFilter
Отправлено: gil9red от Июль 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.


Хотелось бы узнать какие-нибудь варианты как с этим жить :)


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


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

Все (почти) исключения проходят через QApplication::notify и не должны его покидать (кроме случаев последующего терминейта программы).
Другое дело, что не везде в Qt обработка исключений сделана правильно (например, в контейнерах - нет)


Название: Re: Падение программы при выбрасывании исключения в eventFilter
Отправлено: Bepec от Июль 06, 2016, 10:42
Qt не использует исключения - а использует оповещение об ошибках, доп проверки и прочее.
Работа стандартных исключений в механизмах Qt не гарантируется и может использоваться вами на ваш страх и риск.

По сути, отказывайтесь или от исключений, или от Qt :D


Название: Re: Падение программы при выбрасывании исключения в eventFilter
Отправлено: gil9red от Июль 06, 2016, 11:58
Спасибо за реакцию :)