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."