Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Exceptions and Qt
Qt 6.11 is out! See what's new in the release blog

Exceptions and Qt

Scheduled Pinned Locked Moved Solved General and Desktop
14 Posts 6 Posters 2.4k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • PerdrixP Offline
    PerdrixP Offline
    Perdrix
    wrote on last edited by
    #5

    Qt rethrew the exception AFAICT as it was reported by the catch code at the end of main() before termination
    D.

    Christian EhrlicherC 1 Reply Last reply
    0
    • PerdrixP Perdrix

      Qt rethrew the exception AFAICT as it was reported by the catch code at the end of main() before termination
      D.

      Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #6

      @Perdrix said in Exceptions and Qt:

      Qt rethrew the exception AFAICT

      No, not even in Qt4:

      https://github.com/qt/qt/blob/0a2f2382541424726168804be2c90b91381608c6/src/corelib/kernel/qeventloop.cpp#L198

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      0
      • S Offline
        S Offline
        SamiV123
        wrote on last edited by
        #7

        Well, the situation is kinda clear. Officially Qt does not allow you to propagate exceptions from a slot or event handler or anything that Qt calls.

        I expect that the code has been written as if there are no exceptions that means that stack unwinding that happens due to exception can a) leak resources b) cause unexpected state and behavior. Might work (or appear to work) once in a while just to cause silent corruption and issues later on.

        1 Reply Last reply
        0
        • PerdrixP Perdrix

          They are not caught in my code except at the end of main() to report them and terminate.

          There are places where exceptions are thrown and caught locally when they are recoverable, but there are some situations that I deliberately allow to result in them terminating the application

          S Offline
          S Offline
          SamiV123
          wrote on last edited by
          #8

          @Perdrix said in Exceptions and Qt:

          There are places where exceptions are thrown and caught locally when they are recoverable

          Sounds like an incorrect use of exceptions tbh. You should not use exceptions for logical conditions that are part of the expected program execution and code flow.

          1 Reply Last reply
          0
          • PerdrixP Offline
            PerdrixP Offline
            Perdrix
            wrote on last edited by Perdrix
            #9

            Its not there as part of expected flow its there to catch a totally invalid condition.

            And the exception if caught by Qt MUST have been rethrown - how else could it end up being caught by the catch clause at the end of main.

            In fact the code to which you pointed me DOES VERY CLEARLY rethrow the exception:

            catch (...) {
                    qWarning("Qt has caught an exception thrown from an event handler. Throwing\n"
                             "exceptions from an event handler is not supported in Qt. You must\n"
                             "reimplement QApplication::notify() and catch all exceptions there.\n");
            
                    // copied from below
                    locker.relock();
                    QEventLoop *eventLoop = d->threadData->eventLoops.pop();
                    Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");
                    Q_UNUSED(eventLoop); // --release warning
                    d->inExec = false;
                    --d->threadData->loopLevel;
            
                    throw;
                }
            

            THIS IS INTENDED TO TERMINATE THE APPLICATION WITH PREJUDICE

            David

            S 1 Reply Last reply
            0
            • PerdrixP Perdrix

              In my code there are a number of places where exceptions are thrown that are intended to be terminal if thrown.

              Qt has recently started complaining about these saying :

              Qt has caught an exception thrown from an event handler. Throwing
              exceptions from an event handler is not supported in Qt.
              You must not let any exception whatsoever propagate through Qt code.
              

              is that really so true if I expect that exception to terminate the application with prejudice.

              David

              S Offline
              S Offline
              SimonSchroeder
              wrote on last edited by
              #10

              @Perdrix said in Exceptions and Qt:

              Qt has recently started complaining about these

              I don't think this is new. As far as I know this has always been there.

              If you want to terminate the application, you should call quit() on the QApplication. This will exit the application somewhat orderly. No need to rethrow exceptions. However, I would just call exit(0) and let the operating system handle clean up. I am not sure what advantage you gain by exiting your app by throwing exceptions compared to other methods of exiting the app.

              1 Reply Last reply
              3
              • PerdrixP Perdrix

                Its not there as part of expected flow its there to catch a totally invalid condition.

                And the exception if caught by Qt MUST have been rethrown - how else could it end up being caught by the catch clause at the end of main.

                In fact the code to which you pointed me DOES VERY CLEARLY rethrow the exception:

                catch (...) {
                        qWarning("Qt has caught an exception thrown from an event handler. Throwing\n"
                                 "exceptions from an event handler is not supported in Qt. You must\n"
                                 "reimplement QApplication::notify() and catch all exceptions there.\n");
                
                        // copied from below
                        locker.relock();
                        QEventLoop *eventLoop = d->threadData->eventLoops.pop();
                        Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");
                        Q_UNUSED(eventLoop); // --release warning
                        d->inExec = false;
                        --d->threadData->loopLevel;
                
                        throw;
                    }
                

                THIS IS INTENDED TO TERMINATE THE APPLICATION WITH PREJUDICE

                David

                S Offline
                S Offline
                SamiV123
                wrote on last edited by SamiV123
                #11

                @Perdrix said in Exceptions and Qt:

                Its not there as part of expected flow its there to catch a totally invalid condition.

                If we're talking about a BUG then that should be an assert (controlled abort) then. But you also said "recoverable" so that makes very little sense.

                1 Reply Last reply
                0
                • aha_1980A Offline
                  aha_1980A Offline
                  aha_1980
                  Lifetime Qt Champion
                  wrote on last edited by
                  #12

                  @Perdrix There has been a thread about Exceptions on the mailing list half a year ago: https://lists.qt-project.org/pipermail/development/2024-May/045252.html

                  You might get more insights about the problematics of Exceptions especially on different architectures from there.

                  Regards

                  Qt has to stay free or it will die.

                  1 Reply Last reply
                  0
                  • PerdrixP Offline
                    PerdrixP Offline
                    Perdrix
                    wrote on last edited by
                    #13

                    Sigh! This is an assertion. Some exceptions such as are thrown by std::filesystem are caught locally and never escape to Qt - those are the recoverable ones.

                    1 Reply Last reply
                    0
                    • PerdrixP Offline
                      PerdrixP Offline
                      Perdrix
                      wrote on last edited by
                      #14

                      @aha_1980 Oh my that's one scary thread on the mailing list. That suggests we need to replace all assertions with local code that detects the error and then terminates. At least we have the technology setup to implement that..

                      Now I at least understand something about the problem. Did anyone ever test -funwind?

                      David

                      1 Reply Last reply
                      0
                      • PerdrixP Perdrix has marked this topic as solved on

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved