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 Perdrix
    #3

    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

    JoeCFDJ S 2 Replies 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

      JoeCFDJ Offline
      JoeCFDJ Offline
      JoeCFD
      wrote on last edited by JoeCFD
      #4

      @Perdrix Qt has caught an exception, but did not exit.

      1 Reply Last reply
      0
      • 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