Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

23.6.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.

Ähnliche Präsentationen


Präsentation zum Thema: "23.6.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure."—  Präsentation transkript:

1 23.6.2000 Universität Dortmund, Lehrstuhl Informatik 1 dittrich@cs.uni-dortmund.de EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure II Prof. Dr. Gisbert Dittrich

2 20-2 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Gliederung Ausnahmebehandlung Grundphänomene – Am Beispiel Konto: 3 Varianten Möglichkeiten bei der Verwendung von Klassenobjekten – 4 Varianten

3 20-3 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Beispiel: Kontoführung Ich kann ein Konto eröffnen, auf ein Konto einzahlen, von einem Konto abheben, ein Konto überziehen, ein Konto wieder schließen. (Abstrakter Datentyp)

4 20-4 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Klasse EinfachesKonto class Konto { protected: int stand; public: Konto(){stand = 0;} ~Konto(){ cout << "Nachricht" << endl; } void Einzahlen(int k) {stand += k;} int Abheben(int k) { stand -= k; return k; } int KontoStand() {return stand;} };

5 20-5 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Klasse EinfachesKonto (Forts.) int main() { int i, j, st; Konto * kto = new Konto; for (i = 0; i < 5; i++) { j = rand(); cout << "\nEingezahlt: \t" << j; kto ->Einzahlen(j); cout << ",\tAbgehoben:\t" Abheben((i+1)*rand()); st = kto ->KontoStand(); cout << ",\tKontostand:\t" << st << (st < 0? " *": ""); } kto ->~Konto(); } Konto1

6 20-6 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Klasse EinfachesKonto (Forts.) Eingezahlt: 16838, Abgehoben: 5758, Kontostand: 11080 Eingezahlt: 10113, Abgehoben: 35030, Kontostand: -13837 * Eingezahlt: 31051, Abgehoben: 16881, Kontostand: 333 Eingezahlt: 23010, Abgehoben: 29676, Kontostand: -6333 * Eingezahlt: 16212, Abgehoben: 20430, Kontostand: -10551 * Konto bei Geschaeftsschluss aufgeloest

7 20-7 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Überziehung des Kontos Wie wird das behandelt? Annahme: – Die Überziehung hat Konsequenzen: – Konto wird dann aufgelöst. Möglichkeiten: nach jeder Abhebung wird gefragt, ob das Konto überzogen ist, – ja: Konto auflösen, Abbruch – nein: weitermachen wie gewohnt.

8 20-8 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Überziehung des Kontos ist für den Code umständlich: – Der Normalfall und der Ausnahmefall werden ineinander vermischt behandelt Alternative: Ausnahmebehandlung – Wenn die Ausnahmesituation entsteht, wird dem benutzen-den Programmteil gesagt: Hier stimmt etwas nicht, es muß etwas geschehen d.h. Ausnahmebehandlung

9 20-9 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Modifikation der Klasse class Konto { protected: int stand; public: Konto(){stand = 0;} ~Konto(){cout << "Nachricht";} void Einzahlen(int k) {stand += k;} int Abheben(int k) {stand -= k; if (stand < 0) throw k; return k; } int KontoStand() {return stand;} };

10 20-10 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Interpretation Wenn diese Bedingung stand < 0 erfüllt ist, aktiviere eine Ausnahme mit dem Wert k: (das ist der Betrag, bei dessen Abheben das Konto überzogen wurde) Die Ausnahme muß irgendwo behandelt werden: (d.h. zum throw gehört ein catch )

11 20-11 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung... der Fänger Konto * kto = new Konto; try{ for (i = 0; i < 5; i++) { cout << "\nEingezahlt: \t" <<...; kto->Einzahlen(...); abh = kto->Abheben(...); cout << ",\nabgehoben: \t" << abh; st = kto->KontoStand(); cout << ",\tKontostand:\t" << st << (st < 0? " *": ""); } catch(int t) { cout << "\nKonto ueberzogen.." << t << "DM\n"; kto->~Konto(); } Konto * kto = new Konto; for (i = 0; i < 5; i++) { cout << "\nEingezahlt: \t" <<...; kto->Einzahlen(...); abh = kto->Abheben(...); cout << ",\nabgehoben: \t" << abh; st = kto->KontoStand(); cout << ",\tKontostand:\t" << st << (st < 0? " *": ""); } Programm

12 20-12 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Hier wurde die Ausnahme offenbar ausgelöst Ausgabe Eingezahlt: 16838, abgehoben: 5758, Kontostand: 11080 Eingezahlt: 10113 Konto ueberzogen beim Abheben von 35030 DM Konto aufgeloest

13 20-13 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Anmerkungen Der Aufruf einer Methode, die eine Ausnahme auslöst, muß in einem Block stattfinden, der mit try eingeleitet wird, also: try {... Methode oder Funktion, die eine Ausnahme auslöst... }

14 20-14 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Anmerkungen Unmittelbar auf try folgt ein oder folgen mehrere catch zur Behandlung der Ausnahme: catch ist parametrisiert: Der formale Parameter wird beim Behandeln der Ausnahme durch einen aktuellen Parameter ersetzt, der von throw gesetzt wird. Analogie: – Funktionsvereinbarung: Arbeit mit formalen Parametern – Funktionsaufruf: Substitution durch aktuelle Parameter

15 20-15 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Kontrollfluß bei der Aktivierung einer Ausnahme: Aktivieren der Ausnahme mit throw Suchen der passenden catch -Klausel Ausführen des entsprechenden Blocks (mit Wurf- Geschoß als aktuellem Parameter) Danach Verlassen der catch -Klausel und Weiterar- beit mit dem Block, der unmittelbar auf die catch - Klauseln folgt Insbesondere: Keine Rückkehr in den try -Block oder die aktivierende Prozedur Anmerkungen

16 20-16 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Beispiel (Forts.) Verdacht auf Steuerbetrug, wenn ein zu hoher Betrag eingezahlt wird. --> Aktivierung einer Ausnahme. Jedoch Problem: Kann die Ausnahme nicht mit throw k aktivieren, da die beiden Situationen auf diese Art nicht voneinander getrennt werden können. Es gilt aber: Es können Instanzen beliebiger Klassen geworfen werden.

17 20-17 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Beispiel (Forts.) Definiere zwei Klassen Ueberziehung VerdachtSteuerbetrug Wirf entsprechende Ausnahmen Behandle die Ausnahmen nach den Typen der geworfenen Argumente, also: Ueberziehung könnte anders behandelt werden als VerdachtSteuerbetrug – z. B.: bei Ueberziehung schließen wir das Konto

18 20-18 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung noch eine ganz normale Klasse Modifiziertes Konto class Ueberziehung { public: int wert; Ueberziehung(int j) { wert = j; } }; class VerdachtSteuerbetrug { public: int wert; VerdachtSteuerbetrug(int z) { wert = z; } }; eine ganz normale Klasse

19 20-19 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung hier werden die entsprechenden Instanzen geworfen Modifiziertes Konto (Forts.) void Einzahlen(int k) { stand += k; if (k > 30000) throw new VerdachtSteuerbetrug(k); } int Abheben(int k) { stand -= k; if (stand < 0) throw new Ueberziehung(k); return k; }

20 20-20 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Behandlung der Ausnahmen catch(Ueberziehung * t) { cout << "\nKonto ueberzogen beim Abheben von " wert << " DM\n"; kto->~Konto(); } catch (VerdachtSteuerbetrug * r) { cout << "\nZu hohe Einzahlung. Steuerbetrug? " wert << endl; } Konto3.cppProgramm

21 20-21 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Ausgaben Zweite Einzahlung: 31340 Eingezahlt: 17000, Abgehoben: 16838, Kontostand: 162 Eingezahlt: 31340 Zu hohe Einzahlung. Steuerbetrug? 31340 --> Hier sind alle Ausnahmen behandelt <-- Zweite Einzahlung: 31340 Eingezahlt: 17000, Abgehoben: 16838, Kontostand: 162 Eingezahlt: 31340 Zu hohe Einzahlung. Steuerbetrug? 31340 --> Hier sind alle Ausnahmen behandelt <-- Zweite Einzahlung: 3134 Eingezahlt: 17000, Abgehoben: 16838, Kontostand: 162 Eingezahlt: 3134 Konto ueberzogen beim Abheben von 5758 DM Konto aufgeloest --> Hier sind alle Ausnahmen behandelt <--

22 20-22 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Passendes catch ? Identifikation der passenden Behandlung? throw T wird von catch (Klasse W) gefangen, falls gilt: – T ist vom Typ W oder der Typ von T erbt von W – diese catch -Klausel ist die erste Klausel, auf die diese Bedingung paßt.

23 20-23 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Beispiel: Definitionen class eins {}; class zwei: public eins {}; class drei { public: void wirfEins() { cout << "\nin wirfEins\n"; throw new eins; } void wirfZwei() { cout << "\nin wirfZwei\n"; throw new zwei; } }; Instanzen dieser Klassen sollen geworfen werden hier wird geworfen

24 20-24 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Klasse zwei ist Spezialfall von Klasse eins Benutzung Ausnahme1 void main() { drei * d3 = new drei; try { d3->wirfZwei(); } catch(eins *) { cout << "\nschmeiße eins\n"; } catch(zwei *) { cout << "\nschmeiße zwei\n"; } }

25 20-25 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung void main() { drei * d3 = new drei; try { d3->wirfZwei(); } catch(zwei *) { cout << "\nschmeiße zwei\n"; } catch(eins *) { cout << "\nschmeiße eins\n"; } Benutzung Ausnahme1A

26 20-26 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Diskussion Ausgabe: Ausnahme1: in wirfZwei schmeiße eins Denn: catch(eins *) fängt die Ausnahme throw (new zwei) (Regel: erste Klausel, die paßt). Ausnahme1A: in wirfZwei schmeiße zwei

27 20-27 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung class vier { public: drei * three; vier() { three = new drei; } void wirf() { try{ three->wirfEins(); } catch(eins *) { cout << "\n\tgefangen!\n"; throw new zwei; } } }; Weiterwerfen: Ausnahme3 Programm

28 20-28 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Was passiert? Ausgabe: in wirfEins gefangen! schmeiße zwei In der Klasse vier wird in der Methode wirf durch den Aufruf von three->wirfEins() eine Ausnahme vom Typ eins aktiviert. Die Ausnahme wird in der Methode wirf behandelt, indem eine Ausnahme von Typ zwei aktiviert wird, die in main behandelt wird.

29 20-29 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung class vier { public: drei * three; vier() { three = new drei; } void wirf() { try{ three->wirfEins(); } catch(eins *) { cout << "\n\tgefangen!\n"; throw new zwei; } }; Klasse vier: Wiederholung

30 20-30 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung class vierExotisch { public: drei * three; vierExotisch () { three = new drei; } void wirf() { try{ three->wirfEins(); } catch(zwei *) { cout << "\n\tgefangen!\n"; throw new zwei; } }; wirft Ausnahme vom Typ eins Klasse vier: exotisch (?)

31 20-31 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Was passiert? Die Ausnahme vom Typ eins wird nicht in der Methode wirf, sondern in main behandelt. Klar: Es ist kein passender Fänger in der Methode vorhanden.

32 20-32 Prof. Dr. G. Dittrich 23.06.2000 EINI II Kap. 20: Ausnahmebehandlung Für heute: Ende


Herunterladen ppt "23.6.2000 Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure."

Ähnliche Präsentationen


Google-Anzeigen