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. [SOLVED] Exception safety in widget constructors?
Qt 6.11 is out! See what's new in the release blog

[SOLVED] Exception safety in widget constructors?

Scheduled Pinned Locked Moved General and Desktop
22 Posts 6 Posters 15.2k Views 1 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.
  • I Offline
    I Offline
    ixSci
    wrote on last edited by
    #12

    Qt claims its classes are exceptions free(bold statement but almost true) that is why there is no leaks at the code presented above.

    1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #13

      The layout does not have a parent and is therefore not caught by the QObject destructor, that's right. The layout is in the parent-child hierarchy only after setLayout() in line 17.

      1 Reply Last reply
      0
      • I Offline
        I Offline
        ixSci
        wrote on last edited by
        #14

        Volker, exactly. But there are no possible exceptions between layout creation and its adoption by the QObject.
        This ctor seems truly exception neutral to me.

        1 Reply Last reply
        0
        • ? Offline
          ? Offline
          A Former User
          wrote on last edited by
          #15

          In this very case, yes. But if someone does some other object creation or manipulation inbetween that can throw an exception, it can raise a problem.

          1 Reply Last reply
          0
          • ? Offline
            ? Offline
            A Former User
            wrote on last edited by
            #16

            [quote author="Volker" date="1294174797"]In this very case, yes. But if someone does some other object creation or manipulation inbetween that can throw an exception, it can raise a problem.[/quote]

            Having just "looked it up":http://doc.trolltech.com/latest/qvboxlayout.html, it appears that QVBoxLayout can take a parent, which should alleviate this concern?

            1 Reply Last reply
            0
            • ? Offline
              ? Offline
              A Former User
              wrote on last edited by
              #17

              [quote author="Volker" date="1294166366"]
              @
              Notepad::Notepad()
              : textEdit(0),
              quitButton(0)
              {
              QVBoxLayout *layout = 0;

              try {
                  textEdit = new QTextEdit(this);
              

              quitButton = new QPushButton(tr("Quit"), this);
                
                   connect(quitButton, SIGNAL(clicked()), this, SLOT(quit()));
                
                  layout = new QVBoxLayout;
                   layout->addWidget(textEdit);
                  layout->addWidget(quitButton);
                
                   setLayout(layout);
              } catch(MyFancyException &e) {
              if(textEdit)
              delete textEdit;

                  if(quitButton)
                      delete quitButton;
              
                  if(layout)
                      delete layout;
              
                  throw e;
              }
              

              setWindowTitle(tr("Notepad"));
              }
              @[/quote]

              Hi, I have a question no related with topic but about this code. Why function "throw" is in a catch block? It is possible to do that? In this example I am little confused because I always been learnig that try block must throw the exception and in catch we catching this exception, in my university it is somethink like hard rule.

              1 Reply Last reply
              0
              • ? Offline
                ? Offline
                A Former User
                wrote on last edited by
                #18

                [quote author="BlackDante" date="1294179880"]
                Hi, I have a question no related with topic but about this code. Why function "throw" is in a catch block? It is possible to do that? In this example I am little confused because I always been learnig that try block must throw the exception and in catch we catching this exception, in my university it is somethink like hard rule. [/quote]

                It is common practice to "rethrow" an exception from a catch block after handling it if it is not the top-level catch. This allows it to propagate to the top-most catch block, if appropriate. Having more than a top-level try/catch block is to be avoided as it's typically unnecessary (as is true in this case), and it makes little sense to rethrow from the top-most catch, which might be where you got this impression. When they do have to be nested, though, it's usually appropriate to rethrow it.

                1 Reply Last reply
                0
                • ? Offline
                  ? Offline
                  A Former User
                  wrote on last edited by
                  #19

                  oh, now I understand :) thanks for explain :)

                  1 Reply Last reply
                  0
                  • I Offline
                    I Offline
                    ixSci
                    wrote on last edited by
                    #20

                    Also you don't have to specify an object when you need to rethrow exception inside a catch block. You just need to type throw; and it will rethrow source object. Moreover you can use some languages tricks such as automated rethrow when using try\catch function block in a ctor.
                    Example:
                    @Notepad()
                    try
                    {
                    //blalala
                    throw "Exception";
                    }catch(...)
                    {
                    //it will rethrow automatically
                    }@

                    1 Reply Last reply
                    0
                    • ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by
                      #21

                      I will definitely have to dive deeper into that exception thingy in the future. So fare I only use that in my Java code and to catch errors from GraphicsMagick. Thanks for that tip, ixSci!

                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        Panke
                        wrote on last edited by
                        #22

                        try-function-blocks are the only way to catch exceptions from the initializer list, too. I would leave a comment every time you use it. Its very simple to forget the auto-rethrow thing. My recommended reading for exception handling is "german article ":http://tinyurl.com/3yuh57x and Bjarne himself "Exception safety in TC++PL":http://www.research.att.com/~bs/3rd_safe0.html

                        1 Reply Last reply
                        0

                        • Login

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