Exceptions
-
Du hast schon ganz richtig erkannt, dass Exceptions zur Fehlerbehandlung gebraucht werden.
Die von Dir vorgeschlagene Lösung - potentiellen Fehlern mit einer
Schleifenkonstruktion zu begegnen - bringt bei komplexen Programmen
diverse Nachteile mit sich: z. B. Langsame Programme und/oder "Spagetti-Code" den kein Mensch mehr versteht.Angenommen Du müsstest einen String in einen Integer umwandeln.
Bei der Funktion die die Umwandlung vornimmt (s. u. parseInt()), könnte
es zu einem ungewollten Fehler kommen. Beispielsweise wenn ihr ein String
mit einem nicht numerischen Wert übergeben wird. Die Funktion wirft (throw)
dann eine Ausnahme (z. B. ein Objekt mit einer Nachricht über den Grund
der Fehlfunktion)So einfach könnte es aussehen:
try { int realInt = Integer::parseInt( "100" ); } catch ( const NumberFormatException& nfe ) { // Tue andere Dinge, wenn ein Fehler auftritt. // Einfachster Fall: Warnung auf der Konsole ausgeben. // cout << nfe.getMessage() << endl; }
Wie viel mehr Code benötigst Du mit einer Schleifen-Konstruktion?
Gruß
H.-Gerd
-
Ich danke erstmal allen, die hier geantwortet haben!
Ich habe nun, dank euch, den Sinn und Nutzen von Exceptions erkannt und werde sie auch einsetzen, sofern ich Einsatzgebiete bei mir finde.Gruß,
Philipp
-
-
hehejo, kommst du von Java?
Also das würd ich auf keinen Fall in C++ machen:
throw new DivNullException("NullTeiler!");
-
javafucker schrieb:
hehejo, kommst du von Java?
Also das würd ich auf keinen Fall in C++ machen:
throw new DivNullException("NullTeiler!");
Nein, ich komme nicht von Java, aber die Exception hab ich in Java kennengelernt!
Warum würdest du das nicht so machen? G-)
-
wo rufst du denn das delete auf für das new???
-
Außerdem catched man Exception per Referenz.
-
oh!
danke.. etz wird's klar!Der Link oben hat auch gut geholfen!
danke!
-
javer schrieb:
wo rufst du denn das delete auf für das new???
die exception wird sowieso nicht gefangen, der typ, den new T liefert ist schliesslich T*
-
Ich hab meinen Code von vorhin etwas abgeändert.
Das "new" ist weg und ich fange die Ausnahme mit "&" auf.Ist das dann so richtig? Würde das so funktionieren? (Wenn nein - warum?)
2 Fragen:
- muss jede exception-Klasse von std::exception abgeleitet sein?
- wie ist die Signatur von std::exception::what()?
-
hehejo schrieb:
muss jede exception-Klasse von std::exception abgeleitet sein?
Nein aber meiner Meingung nach hat es nur Vorteile jede Exception von std::exception erben zu lassen.
hehejo schrieb:
wie ist die Signatur von std::exception::what()?
const char*what()const throw();
-
Irgendwer schrieb:
hehejo schrieb:
muss jede exception-Klasse von std::exception abgeleitet sein?
Nein aber meiner Meingung nach hat es nur Vorteile jede Exception von std::exception erben zu lassen.
Stimmt. Hat ja keine Nachteile.
Eigentlich nur Vorteile.
Die Exception wird auch mit catch (std::exception& e) gefangen!Irgendwer schrieb:
hehejo schrieb:
wie ist die Signatur von std::exception::what()?
const char*what()const throw();
Vielen Dank! Was wirft denn diese Funktion?
-
Nichts.