Qt World Summit: Register Today!

What is the difference between configuring QT with -no-exceptions and -DQT_NO_EXCEPTIONS?

  • What is the difference between -no-exceptions and -DQT_NO_EXCEPTIONS? And what is right way to get rid of “try { } catch (…) {}” in qtbase\src\corelib\thread\qthread_unix.cpp?

    void *QThreadPrivate::start(void *arg)
    #if !defined(Q_OS_ANDROID)
        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
        pthread_cleanup_push(QThreadPrivate::finish, arg);
    #ifndef QT_NO_EXCEPTIONS
            QThread *thr = reinterpret_cast<QThread *>(arg);
            QThreadData *data = QThreadData::get2(thr);
                QMutexLocker locker(&thr->d_func()->mutex);
                // do we need to reset the thread priority?
                if (int(thr->d_func()->priority) & ThreadPriorityResetFlag) {
                    thr->d_func()->setPriority(QThread::Priority(thr->d_func()->priority & ~ThreadPriorityResetFlag));
                data->quitNow = thr->d_func()->exited;
            if (data->eventDispatcher.load()) // custom event dispatcher set?
    #if (defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_QNX))
                // sets the name of the current thread.
                QString objectName = thr->objectName();
                pthread_t thread_id = from_HANDLE<pthread_t>(data->threadId.load());
                if (Q_LIKELY(objectName.isEmpty()))
                    setCurrentThreadName(thread_id, thr->metaObject()->className());
                    setCurrentThreadName(thread_id, objectName.toLocal8Bit());
            emit thr->started(QThread::QPrivateSignal());
    #if !defined(Q_OS_ANDROID)
            pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    #ifndef QT_NO_EXCEPTIONS
    #ifdef __GLIBCXX__
        // POSIX thread cancellation under glibc is implemented by throwing an exception
        // of this type. Do what libstdc++ is doing and handle it specially in order not to
        // abort the application if user's code calls a cancellation function.
        catch (const abi::__forced_unwind &) {
    #endif // __GLIBCXX__
        catch (...) {
    #endif // QT_NO_EXCEPTIONS

    I tried to build QT/Android on Windows with -DQT_NO_EXCEPTIONS, but got the following error:

    ....\include\QtXmlPatterns\5.11.1\QtXmlPatterns/private/../../../../../src/xmlpatterns/utils/qpatternistlocale_p.h:275:2: error: #error "Patternist uses exceptions and cannot be built without."

  • Lifetime Qt Champion


    IIRC, the former will trigger the generation the latter. If you don't use it, you can also skip building the QtXmlPatterns module.

  • @SGaist Hi!

    I built QT without QtXmlPatterns, but it is not clear enough what to use -no-exceptions or -DQT_NO_EXCEPTIONS.

  • Lifetime Qt Champion

    AFAIK -no-exceptions when configuring Qt and QT_NO_EXCEPTIONS when you want to be able to provide both version within your code.

  • @SGaist I succeeded with QT_NO_EXCEPTIONS, now there is no "try {} catch (...)" in qtbase\src\corelib\thread\qthread_unix.cpp, but If I do

    configure.bat -prefix C:\Qt\Qt5.11-Android -no-exceptions -release -force-debug-info -platform win32-g++ -opengl es2 -xplatform android-g++ -android-ndk C:\Users\D-Ef\AppData\Local\Android\Sdk\ndk-bundle -android-sdk C:\Users\D-Ef\AppData\Local\Android\Sdk -opensource -confirm-license -nomake tests -nomake examples

    with QT 5.11.1, I get:

    ERROR: Unknown command line option '-no-exceptions'.

  • Lifetime Qt Champion

    Getting old... I forgot that it was an option for Qt 4 when not all compilers supported exceptions which is not the case anymore.

Log in to reply