C ++: Der Ausnahmemechanismus

Das nächste Mal, wenn Sie eine C ++ Codebeispiel untersuchen, nehmen Sie einen genaueren Blick auf die Schritte, dass der Code durch eine Ausnahme zu behandeln geht. Wenn der Wurf auftritt, C ++ zuerst kopiert das Objekt zu einem neutralen Ort geworfen. Es beginnt dann das Ende des aktuellen Suche Versuchen Block.

Wenn ein Versuchen Block nicht in der aktuellen Funktion gefunden wird, wird die Steuerung an die aufrufende Funktion. Eine Suche wird dann von dieser Funktion gemacht. Wenn kein Versuchen Block dort gefunden wird, geht die Steuerung auf die Funktion, die es genannt, und so weiter bis der Stapel von Funktionen aufrufen. Dieser Vorgang wird aufgerufen Abwickeln des Stapels.

Ein wichtiges Merkmal des Stapels Abwickeln ist, dass jeder Stapel abgewickelt wird, Objekte, die außerhalb des Bereichs sind zerstört so, als ob die Funktion ausgeführt hatte ein Rückkehr Erklärung. Dies hält das Programm von Vermögen zu verlieren oder verlassen Gegenstände baumeln.

Wenn die Ummantelungs Versuchen Block gefunden wird, sucht der Code der ersten Fang Satz unmittelbar nach der schließenden Klammer der Fang Block. Wenn das Objekt geworfen entspricht der Art der Argumentation in der angegebenen Fang Anweisung, wird die Steuerung an, daß Fang Phrase.

Wenn nicht, wird eine Überprüfung des nächsten gemacht Fang Phrase. Wird kein passender Fang Phrasen, die Code sucht nach der nächsthöheren Ebene gefunden Versuchen Block in einer sich ständig nach außen Spirale, bis eine angemessene Fang kann gefunden werden. Wenn kein Fang Ausdruck gefunden wird, wird das Programm beendet.

Betrachten Sie das folgende Beispiel:

// CascadingException - das folgende Programm veranschaulicht ein Beispiel für Stapel // Abwickeln # include #einschließen #einschließen using namespace std - // Prototypen einiger Funktionen, die wir latervoid f1 () müssen - Leere f2 () - Leere f3 () - Klasse Obj {public: Obj (char c): label (c) {cout lt; lt; "Constructing Objekt" lt; lt; Etikette lt; lt; endl-} ~ Obj () {cout lt; lt; "Zerstörende Objekt" lt; lt; Etikette lt; lt; endl-} geschützt: char label -} - int main (int nNumberofArgs, char * pszArgs []) {f1 () - // warten, bis der Benutzer vor dem Beenden Programm bereit ist, // damit der Benutzer das Programm resultscout zu sehen lt; lt; "Drücken Sie die Eingabetaste, um fortzufahren ..." lt; lt; Endl-cin.ignore (10, ' n') - cin.get () - Rückkehr 0-} void f1 () {Obj a ( 'a') - try {Obj b ( 'b') - f2 () -} catch (float f) {cout lt; lt; "Float fangen" lt; lt; endl-} catch (int i) {cout lt; lt; "Int fangen" lt; lt; endl-} catch (...) {cout lt; lt; string ( "Generic catch") lt; lt; Endl -}} void f2 () {try {Obj c ( 'c') - f3 () -} catch (string msg) {cout lt; lt; "String fangen" lt; lt; Endl -}} void f3 () {Obj d ( 'd') - Wurf 10-}

Die Ausgabe dieses Programm ausgeführt wird wie folgt angezeigt:

Constructing Objekt aConstructing Objekt bConstructing Objekt cConstructing Objekt dDestructing Objekt dDestructing Objekt cDestructing Objekt Bint catchDestructing Objekt aDrücken eingeben, um fortzufahren ...

Zunächst sehen Sie die vier Objekte a, b, c, und d so konstruiert, wie Main() Anrufe f1 () die Anrufe f2 () die Anrufe f3 (). Anstatt Rückkehr jedoch f3 () wirft die ganze Zahl 10. Da keine Versuchen Block ist definiert in f3 (), C ++ abwickelt f3 () # 8242-s Stapel, wodurch Objekt d werden zerstört.

Die nächste Funktion oben in der Kette, f2 () definiert eine Versuchen Block, aber es ist nur Fang Satz ist so konzipiert, ein Griff Schnur, die doesn # 8242-t Spiel der int geworfen. Deshalb setzt C ++ an. Diese abwickelt f2 () # 8242-s Stapel, in Objekt resultierende c wird zerstört.

Zurück in f1 (), C ++ findet eine andere Versuchen Block. Beenden diesen Block Ursachen Objekt b out of scope zu gehen. C ++ überspringt die erste Fang Satz für eine schweben. Der nächste Fang Ausdruck bringt die int genau, also C ++ geht die Steuerung zu diesem Satz.

Die Steuerung geht von dem catch (int) Begriff der schließenden Klammer des Abschluss Fang Satz und von dort zurück zum Main(). Das endgültige Fang(...) Phrase, die jedes Objekt geworfen fangen würde, wird da eine passende übersprungen Fang Satz wurde bereits gefunden.

Menü