NonVCL-Exceptions in WinMain abfangen



  • Überschrift beschreibt meine Frage 😉

    So funktioniert es auf jeden Fall nicht:

    class MyException {};
    
    // wird irgendwo aufgerufen
    void foo()
    {
       throw new MyException;
    }
    
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR CmdLine, int)
    {
       try
       {
       [...]
       }
       catch (Exception &exception)
       {
        [...]
       }catch (MyException & e){
          // hier kommt es nie an (Auch wenn Exceptions ausgelöst werden)
       }catch(MyException * e) {
       /* Ich dachte zunächst, dass es daran liegen könnte dass in foo() 
         ein Pointer "geschickt" wird, aber in der catch eine Refenz abgefragt
        wird. Aber auch hier wird nichts ausgeführt */
      }
    }
    


  • HI,

    füge unten an:

    catch(...)
      {
       // hier kommt alles an, was nicht zu den anderen Exceptions gehört
      }
    


  • Hi,
    dann ist es aber nicht möglich auf das Exception-Objekt zuzugreifen, oder? Das brauche ich nämlich auch.



  • dann must du nachschauen, welche Typ von Exception geworfen wird und diesen Abfangen. Das wiederum hängt davon ab, was du in der Funktion anstellst.



  • Ich glaube Du hast mich falsch verstanden (oder ich dich).
    Das Problem ist das der try-catch-Block von der WinMain (egal ob für jede Exception mittels catch(...) oder spezielle catch(MyException & e)) nicht ausgeführt wird.
    Wenn ich den try-catch-Block z.B. so implementiere:

    // In Project1.cpp
    #include <vcl.h>
    #pragma hdrstop
    USERES("Project1.res");
    USEFORM("Unit1.cpp", Form1);
    USEUNIT("Unit2.cpp");
    //---------------------------------------------------------------------------
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
       try
       {
          Application->Initialize();
          Application->CreateForm(__classid(TForm1), &Form1);
           Application->Run();
       }
       catch (Exception &exception)
       {
          Application->ShowException(&exception); // Hier wird auch nichts ausgeführt, ist auch logisch.
       }catch(...) {
          ShowMessage("Fehler in ...-Block"); // Die Meldung wird aber nicht angezeigt
       }catch(MyException & e){
          ShowMessage("Fehler in MyException-Blok"); // Diese auch nicht
       }
       return 0;
    }
    

    und in das Forumar ein Button einfüge, dass beim Anklicken eine Exception vom Typ MyException auslöst.

    // In Unit1.cpp
    [...]
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      throw new MyException;
    }
    [...]
    

    Der Header Unit1.h enthält noch die MyException-Deklaration

    // In Unit1.h
    [...]
    class MyException { };
    

    Das Einzige was mich über einen Fehler informiert ist die Meldung: "C++ Exception."


Log in to reply