Обработка исключений не работает с Qt в Windows

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

Я использую Qt 4.7.0 (32-разрядная версия) из Qt SDK v2010.05 в Windows 7 (64-разрядная версия), g++ (GCC) 4.5.1 от MinGW, NetBeans 6.9.1. Но я также проверил это с помощью g++ 3.4.5 (тоже от MinGW) и Qt Creator 2.0.1 - такое же странное поведение.

Например (самый простой случай):

#include <Qt/QApplication.h>
#include <iostream>
#include <stdexcept>
#include <cstdlib>

using namespace std;


int main(int argc, char* argv[]) {
    QApplication app(argc, argv);

    try {
        cout << "Before exception" << endl;
        throw runtime_error("Exception occured");
        cout << "After exception" << endl;
    } catch (runtime_error& exc) {
        cout << exc.what() << endl;
        exit(1);
    }

    return 0;
}

Когда я выполняю вышеуказанную программу, я получаю этот вывод:

До исключения

Это приложение запросило у среды выполнения необычное завершение его работы.
Пожалуйста, свяжитесь со службой поддержки приложения для получения дополнительной информации.

Я пытался добавить флаг "-fexceptions" в g++, но это ничего не изменило.

Когда я не использую Qt, все в порядке:

#include <Qt/QApplication.h> // It is not caused only by including Qt header
                             // so it doesn't matter if I comment this out or not
#include <iostream>
#include <stdexcept>
#include <cstdlib>

using namespace std;


int main(int argc, char* argv[]) {
    // QApplication app(argc, argv);

    try {
        cout << "Before exception" << endl;
        throw runtime_error("Exception occured");
        cout << "After exception" << endl;
    } catch (runtime_error& exc) {
        cout << exc.what() << endl;
        exit(1);
    }

    return 0;
}

Выход:

Перед исключением
Произошло исключение

Кто-нибудь знает, почему так происходит и как это исправить? Это как-то связано с типом метода обработки исключений (SJLJ или Dwarf-2), который использовался при сборке Qt?


person revers    schedule 10.11.2010    source источник
comment
Фу, ты меня напугал! Мы, вероятно, собираемся перейти на Qt по моей рекомендации, и это было бы убийственно. Хорошо, что это работает с VS.   -  person Edward Strange    schedule 11.11.2010
comment
Где именно вылетает? Есть ли шанс найти более точное место? QApplication notify() возможно?   -  person Bart    schedule 11.11.2010
comment
вероятно, он настроен с флагом -no-exceptions. Попробуйте перенастроить и переделать Qt SDK.   -  person Nick Dandoulakis    schedule 11.11.2010
comment
Хм, это дословно сообщение Microsoft CRT. Насколько хорошо mingw эмулирует его настолько? Сомнительная и, вероятно, причина этой проблемы.   -  person Hans Passant    schedule 11.11.2010
comment
@Hans Passant: Mingw ссылается на MSVCRT.   -  person MSalters    schedule 11.11.2010
comment
Столкнулся с той же проблемой, но пока никакое решение не работает для меня. Хотя я считаю, что revers указал на правильное решение, я пока не могу заставить его работать. Я дважды перекомпилировал Qt, но безуспешно. Какую версию MinGW и компиляторов вы используете?   -  person fAX    schedule 23.01.2011


Ответы (2)


Я переконфигурировал и перекомпилировал Qt с флагом -exceptions:
D:\Qt\2010.05\qt>mingw32-make confclean && configure -exceptions && mingw32-make
и теперь все в порядке!

Спасибо всем за помощь, особенно Nick D!

В любом случае, очень странно, что у меня была сборка Qt без этого флага. Я скачал Qt SDK в бинарном виде с официального сайта.

person revers    schedule 11.11.2010

Больше нет необходимости использовать флаг -exceptions с Qt. В Qt Creator 4 это значение по умолчанию, и мое приложение Qt для Windows с радостью использует обширную и обширную обработку исключений без проблем. Сборки Qt MSVC используют параметр компилятора /EHsc, который включает обычную обработку исключений.

person Graham Asher    schedule 12.12.2020