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. Exception Handing In QT C++
Forum Updated to NodeBB v4.3 + New Features

Exception Handing In QT C++

Scheduled Pinned Locked Moved Unsolved General and Desktop
9 Posts 3 Posters 1.9k Views 3 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.
  • Ketan__Patel__0011K Offline
    Ketan__Patel__0011K Offline
    Ketan__Patel__0011
    wrote on last edited by Ketan__Patel__0011
    #1

    Hello Friends And QT Experts And Champions

    Currently I Am working With Exception Handing In QT C++
    i read many articles of Exception handing Or Application Crash Handing when Exception is Raise in My Application

    My Code Is :

    In C++ File (Source File)

    LONG MainWindow::AppCrashHandler(EXCEPTION_POINTERS *pException)
    {
        HANDLE hDumpFile = CreateFile((LPCWSTR)(QCoreApplication::applicationDirPath() + QDateTime::currentDateTime().toString("/yyyy-MM-dd-hh-mm-ss")+".dmp").utf16(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hDumpFile != INVALID_HANDLE_VALUE)
        {
            MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
            dumpInfo.ExceptionPointers = pException;
            dumpInfo.ThreadId = GetCurrentThreadId();
            dumpInfo.ClientPointers = TRUE;
            MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
        }
        EXCEPTION_RECORD* record = pException->ExceptionRecord;
        QString errCode(QString::number(record->ExceptionCode, 16)), errAdr(QString::number((uint)record->ExceptionAddress, 16)), errMod;
        QMessageBox::critical(nullptr, "Error", QString("Error Code: %1 Error Address: %2").arg(errCode).arg(errAdr),QMessageBox::Ok);
        return EXCEPTION_EXECUTE_HANDLER;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        __try
        {
            int a = 10;
            int b = 0;
            int c = 0;
            c = a / b;
            std::cout << c;
        }
        __except(faultHandler(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER)
        {
    
        }
    }
    
    void MainWindow::on_pushButton_2_clicked()
    {
        __try
        {
            std::string *temp = new std::string[100];
            temp[0] = "ABCD";
            temp[1] = "ABCDEFGH";
            temp[2] = "ABCDEFGHIJKL";
            temp[150] = "ABCDEFGHIJKLMNOP";
        
            std::cout << temp[0];
            std::cout << temp[1];
            std::cout << temp[2];
            std::cout << temp[150];
        }
        __except(faultHandler(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER)
        {
    
        }
    }
    
    

    You can see in my code i am trying To Handle some types of exception like in DivideByZero OR Invalid Memory Pointer Access

    My Problem is i can't use Qt Class or Object Like QString , QSqlDatabase Class Or etc...

    Whenever I am trying To use Qt Class or Object in __try Block that time it wiil display error message
    *** Error Message ***
    error: C2712: Cannot use __try in functions that require object unwinding

    Please Help me to solve this problem OR suggest me any other way to handle Exception at runtime And if you have any other idea or Solution so please drop hear.

    Thanks you so much To All

    JonBJ 1 Reply Last reply
    0
    • Ketan__Patel__0011K Ketan__Patel__0011

      Hello Friends And QT Experts And Champions

      Currently I Am working With Exception Handing In QT C++
      i read many articles of Exception handing Or Application Crash Handing when Exception is Raise in My Application

      My Code Is :

      In C++ File (Source File)

      LONG MainWindow::AppCrashHandler(EXCEPTION_POINTERS *pException)
      {
          HANDLE hDumpFile = CreateFile((LPCWSTR)(QCoreApplication::applicationDirPath() + QDateTime::currentDateTime().toString("/yyyy-MM-dd-hh-mm-ss")+".dmp").utf16(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
          if (hDumpFile != INVALID_HANDLE_VALUE)
          {
              MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
              dumpInfo.ExceptionPointers = pException;
              dumpInfo.ThreadId = GetCurrentThreadId();
              dumpInfo.ClientPointers = TRUE;
              MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
          }
          EXCEPTION_RECORD* record = pException->ExceptionRecord;
          QString errCode(QString::number(record->ExceptionCode, 16)), errAdr(QString::number((uint)record->ExceptionAddress, 16)), errMod;
          QMessageBox::critical(nullptr, "Error", QString("Error Code: %1 Error Address: %2").arg(errCode).arg(errAdr),QMessageBox::Ok);
          return EXCEPTION_EXECUTE_HANDLER;
      }
      
      void MainWindow::on_pushButton_clicked()
      {
          __try
          {
              int a = 10;
              int b = 0;
              int c = 0;
              c = a / b;
              std::cout << c;
          }
          __except(faultHandler(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER)
          {
      
          }
      }
      
      void MainWindow::on_pushButton_2_clicked()
      {
          __try
          {
              std::string *temp = new std::string[100];
              temp[0] = "ABCD";
              temp[1] = "ABCDEFGH";
              temp[2] = "ABCDEFGHIJKL";
              temp[150] = "ABCDEFGHIJKLMNOP";
          
              std::cout << temp[0];
              std::cout << temp[1];
              std::cout << temp[2];
              std::cout << temp[150];
          }
          __except(faultHandler(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER)
          {
      
          }
      }
      
      

      You can see in my code i am trying To Handle some types of exception like in DivideByZero OR Invalid Memory Pointer Access

      My Problem is i can't use Qt Class or Object Like QString , QSqlDatabase Class Or etc...

      Whenever I am trying To use Qt Class or Object in __try Block that time it wiil display error message
      *** Error Message ***
      error: C2712: Cannot use __try in functions that require object unwinding

      Please Help me to solve this problem OR suggest me any other way to handle Exception at runtime And if you have any other idea or Solution so please drop hear.

      Thanks you so much To All

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #2

      @Ketan__Patel__0011
      I don't see this has much to do with Qt.

      99% of your code has nothing Qt in it --- just C++/std:: library.

      Since your AppCrashHandler() is entirely Windows-specific, I would get rid of it using Qt classes like QDateTime or QString, and replace QMessageBox with the native Windows SDK MessageBox, and then it's all standalone Windows code and you won't have Qt issues....

      P.S.
      Having said the above --- which if I were you I would do anyway --- I don't think your Qt code which is only in AppCrashHandler() has anything to do with the error message. I thought that would come from e.g. your std::string *temp. Unless you are choosing to show code which does not produce the error message...?

      It should be only from things directly inside the __try? And if you insist on having Qt/std::/whatever there, if you can push that down into a function call instead I think the error goes away?

      Ketan__Patel__0011K 1 Reply Last reply
      0
      • JonBJ JonB

        @Ketan__Patel__0011
        I don't see this has much to do with Qt.

        99% of your code has nothing Qt in it --- just C++/std:: library.

        Since your AppCrashHandler() is entirely Windows-specific, I would get rid of it using Qt classes like QDateTime or QString, and replace QMessageBox with the native Windows SDK MessageBox, and then it's all standalone Windows code and you won't have Qt issues....

        P.S.
        Having said the above --- which if I were you I would do anyway --- I don't think your Qt code which is only in AppCrashHandler() has anything to do with the error message. I thought that would come from e.g. your std::string *temp. Unless you are choosing to show code which does not produce the error message...?

        It should be only from things directly inside the __try? And if you insist on having Qt/std::/whatever there, if you can push that down into a function call instead I think the error goes away?

        Ketan__Patel__0011K Offline
        Ketan__Patel__0011K Offline
        Ketan__Patel__0011
        wrote on last edited by
        #3

        @JonB

        sorry to say but I didn't get you
        can you explain in other way ?
        can you modified my code ? OR can you share Example if you have

        1 Reply Last reply
        0
        • Chris KawaC Offline
          Chris KawaC Offline
          Chris Kawa
          Lifetime Qt Champion
          wrote on last edited by Chris Kawa
          #4

          Structured Exception Handling, or SEH in short (the __try/__except things) is a Windows specific extension to the language and is not very well suited for complex C++ scenarios. It has many limitations, like the one you see. As the message says you can't use it in context where an object with a destructor is present. A common workaround is to move the __try/__except code to a separate function, so for example instead of this:

          void func()
          {
             SomeComplexObjectLikeQObject obj;
             __try
             { ... }
             __except(...)
             { ... }
          }
          

          do something like this:

          void workaround()
          {
             __try
             { ... }
             __except(...)
             { ... }
          }
          
          void func()
          {
             SomeComplexObjectLikeQObject obj;
             workaround();
          }
          

          All in all SEH is intended rather for a C style code that integrates with WinAPI. If possible try switching to the standard C++ exception handling (try/catch) and you'll avoid a lot of gotchas.

          Ketan__Patel__0011K 1 Reply Last reply
          4
          • Chris KawaC Chris Kawa

            Structured Exception Handling, or SEH in short (the __try/__except things) is a Windows specific extension to the language and is not very well suited for complex C++ scenarios. It has many limitations, like the one you see. As the message says you can't use it in context where an object with a destructor is present. A common workaround is to move the __try/__except code to a separate function, so for example instead of this:

            void func()
            {
               SomeComplexObjectLikeQObject obj;
               __try
               { ... }
               __except(...)
               { ... }
            }
            

            do something like this:

            void workaround()
            {
               __try
               { ... }
               __except(...)
               { ... }
            }
            
            void func()
            {
               SomeComplexObjectLikeQObject obj;
               workaround();
            }
            

            All in all SEH is intended rather for a C style code that integrates with WinAPI. If possible try switching to the standard C++ exception handling (try/catch) and you'll avoid a lot of gotchas.

            Ketan__Patel__0011K Offline
            Ketan__Patel__0011K Offline
            Ketan__Patel__0011
            wrote on last edited by
            #5

            @Chris-Kawa
            Thanks For Your Reply
            Before __try and __except I was using try and catch but i didn't work for handle Runtime Exception
            that's why i am switch to __try and __except

            JonBJ 1 Reply Last reply
            0
            • Chris KawaC Offline
              Chris KawaC Offline
              Chris Kawa
              Lifetime Qt Champion
              wrote on last edited by Chris Kawa
              #6

              Yup, some stuff is not handled by exceptions in C++, just specified as undefined behavior. That behavior might be defined for given platform though, like in POSIX or, in this case, Windows.
              Ok, so just keep in mind that you can't have complex objects in the same function as __try/__except. My example was with an object outside the try block, but its the same for objects inside. Just move the body of a try block to a separate function in that case.

              1 Reply Last reply
              0
              • Ketan__Patel__0011K Ketan__Patel__0011

                @Chris-Kawa
                Thanks For Your Reply
                Before __try and __except I was using try and catch but i didn't work for handle Runtime Exception
                that's why i am switch to __try and __except

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by JonB
                #7

                @Ketan__Patel__0011 said in Exception Handing In QT C++:

                Before __try and __except I was using try and catch but i didn't work for handle Runtime Exception

                Just to say: not sure what you're hoping to do handling RTEs much? Why are you getting them? Are you allowing your code to continue after catching one?

                Ketan__Patel__0011K 1 Reply Last reply
                0
                • JonBJ JonB

                  @Ketan__Patel__0011 said in Exception Handing In QT C++:

                  Before __try and __except I was using try and catch but i didn't work for handle Runtime Exception

                  Just to say: not sure what you're hoping to do handling RTEs much? Why are you getting them? Are you allowing your code to continue after catching one?

                  Ketan__Patel__0011K Offline
                  Ketan__Patel__0011K Offline
                  Ketan__Patel__0011
                  wrote on last edited by
                  #8

                  @JonB
                  Thanks For Reply

                  Yes I want to continue my process after catching one exception

                  JonBJ 1 Reply Last reply
                  0
                  • Ketan__Patel__0011K Ketan__Patel__0011

                    @JonB
                    Thanks For Reply

                    Yes I want to continue my process after catching one exception

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by
                    #9

                    @Ketan__Patel__0011
                    Then you will still have to verify that it is safe, and all is actually well, to continue after the particular exception. Just saying, it may or may not be.

                    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