Exceptions
-
Hallo!
Ich habe kurz mal eine Frage. Wozu braucht man Exceptions, werden sie genutzt? Also mir ist klar, dass sie zur Fehlerbehandlung genutzt werden, aber man kann doch potentielle Fehler mit Schleifenkonstruktionen abfangen, wozu dann Exceptions? Könnte mir auch jemand nochmal naeher "throw" erklären, was es genau macht?
Ich danke schonmal im voraus!MfG,
Philipp
-
Brutus schrieb:
Wozu braucht man Exceptions
Um die eigentliche Anwendungslogik und die Fehlerbehandlung voneinander zu trennen.
werden sie genutzt?
Ja
-
Tja sagen wir es mal so:
Eine geworfene Exception zwingt dich dazu zu, sie zu behandeln.
Macht du das nämlich nicht, so wird die Exception weiter nach oben gegeben und irgendwann stoppt dann das System dein Programm.Wenn du an eine Methode (in der eine Exception auftreten könnte), dass throw anhängst dann muss sich der Aufrufer damit beschäftigen.
kleines "pseudocode"-Beispiel:
class Exception { protected: string failureText; public: Exception(string failure) : failureText(failure) {} virtual ~Exception() {}; virtual const string& toString() { return failureText; } }; class DivNullException : Exception { public: DivNullException(string failure) : Exception(failure) {}; virtual const string& toString() { return "DIV NULL " + failureText; } }; float div(float a, float b) throw DivNullException { if(b == 0) throw DivNullException("NullTeiler!"); return a/b; } int main() { float a = 1; float b = 0; float c = 0; try { c = div(a,b); } catch (DivNullException& e) { cout << e.toString(); } return 0; } // so in Etwa.. Kein Anspruch auf fehlerhafen Code.
Einer Exception kannst du meist mitgeben was passiert ist.
Bzw. du kannst rauslesen, was passiert ist.Aber du musst dich um die Behandlung der Exception kümmern. Sonst bubbelt die bis ganz nach oben und das System beendet dein Programm!
-
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.