Frage zu Vordefinierten Ausnahmebehandlungen
-
Hallo Zusammen
Kann mir hier jemand sagen, oder irgendwo hin verweisen wo steht, was bei der vordefinierten Ausnahmebehandlung für Windows-Programme in der .cpp Datei eines Projekts geschieht?
Es geht nur um die Wirkung der einzelnen try-, catch- und throw-Anweisungen.Bin gespannt auf die Antworten!
Sonnige Grüsse
PS: bin ich im richtigen thema? war mit nicht 100% sicher wo ich das hinschreiben sollte..
-
ist übrigens von mir, nicht vom einem unregistrierten. da ist wohl was falsch gelaufen
-
Hallo
try-catch ist weder etwas Windows- noch etwas Builder-spezifisches. Du kannst dir also jede Definition und Dokumentation zu try-catch im Netz suchen die du willst. Natürlich auch die von Microsoft.
bis bald
akari
-
Wenn innerhalb eines VCL-Eventhandlers (z.B. Button1Click()) eine Exception geworfen und nicht gefangen wird, dann fängt die VCL die Exception ab. (Technische Details hier: http://www.audacia-software.de/de/bcb/external-exception-eefface.htm)
Wenn du eine Exception in einer Methode wirfst, die nicht vom VCL-Message-Loop aufgerufen wird (z.B. direkt in WinMain()), dann stürzt dein Programm ab.
-
danke für die antworten. ich hab mal was geschrieben, wüsste gern ob ihr damit einverstanden seit.
folgendes:
Try:
Mit der try-Anweisung wird die Fehlerbehandlung bewusst aus dem normalen Programmablauf herausgenommen.
Es wird versucht das Programm fehlerfrei abzuarbeiten.
Alle innerhalb des try-Blocks aufgerufenen Funktionen werden auf Ausnahmefehler behandelt und einem Behandlungsblock zugeführt.Catch:
Hier werden die Abstürze aufgefangen wie bei einem Netz.
Sobald das es zu einem Fehler kommt, wird die nächste catch-Anweisung verwendet, die auf den Ausnahmetyp passt.
Um die nächste Ausnahmebehandlung zu finden, wird die Aufrufreihenfolge rückwärts durchlaufen.
Dadurch wird immer die Ausnahmebehandlung verwendet, die der Fehlerstelle am nächsten ist.Throw:
Wenn die mit throw behandelten Ausnahmen ausgelöst werden, wird die Verarbeitung sofort abgebrochen und der Compiler springt direkt in die passende Ausnahmebehandlung.
Throw übergibt ausserdem noch Informationen wie beispielsweise der Name der Datei, die die Probleme verursacht oder die Fehlernummer an die catch-Anweisung.freundliche grüsse
-
Sieht gut aus. Bemerkenswert ist noch, daß C++ lokale Objekte destruiert, wenn ein Scope verlassen wird - egal, ob via Exception oder auf regulärem Wege:
void myFunction (void) { std::auto_ptr<TStringList> myStringList (new TStringList); myStringList->Add ("foo"); myStringList->Add ("bar"); ShowMessage (myStringList->Strings[42]); // wirft "out-of-range"-Exception }
Der Destruktor von std::auto_ptr<> zerstört das zugehörige Objekt, das am Anfang mittels
new TStringList
erstellt wurde. Dies ist auch der Fall, wenn wie in obiger Situation eine Exception den Programmfluß unterbricht. Aus diesem Grund sollte man für dynamisch angeforderten Speicher Smart-Pointer wie std::auto_ptr<> benutzen.Lehrling91 schrieb:
Throw übergibt ausserdem noch Informationen wie beispielsweise der Name der Datei, die die Probleme verursacht oder die Fehlernummer an die catch-Anweisung.
Der C++-Standard schreibt das nicht vor. C++Builder macht das zwar, aber auch nur dann, wenn du den "-xp"-Switch aktivierst:
http://docwiki.embarcadero.com/RADStudio/de/C++-Compiler (Abschnitt "Positionsinformation").