Try-Catch bei String in double
-
Hey!
Ich soll gerade einem Freund bei einem einfachen Taschenrechner in C++ helfen. Im Kern hat mein Freund auch eigentlich alles gut hinbekommen, nur stürzt sein Programm immer ab wenn man anstatt Zahlen Buchstaben eingibt (Die Konsolenausgabe spielt verrückt). Das ist auch recht logisch wenn man sich mal (eine) der betreffenden Zeilen anschaut:
//... double eingabe = 0; std :: cout << "Die Zahl: " << std :: endl; std :: cin >> eingabe; //...Da kam natürlich die Frage: Wie verhindere ich das?
Erst dachte ich persönlich an Strings bzw. char-Arrays und ein cin.getline, womit man alles einliest, den array überprüft und dann unter Umständen umwandelt. Doch das ist irgendwo doch zu aufwendig, daher meine Idee: try-catch:try { std :: cout << "Die Zahl:" << std :: endl; std :: cin >> eingabe; } catch(...) { std :: cout << "Falsche Eingabe?" << std :: endl; }Doch irgendwie greift das hier nicht? Warum wird hier keine exception erzeugt?
Wenn es ein einzelner Char gewesen wäre, wäre das logisch, denn jeder Buchstabe ist ja im PC intern nur eine Zahl. Nur bei einem ganzen Strink ist das komisch. Würde da nicht eigentlich der Pointer des Strings (also der Zeiger auf das 1. Element) versucht werden in dem double zu speichern? Wenn ja wo ist da das Problem? Gibts da keine Typenumwandlung für oder woran liegt das da?
P.S.: Im selben Zug viel mir auf, dass beim g++ auf Linux keine Exception bei der Division druch 0 erzeugt wird. Auf der Konsole wird lediglich "inf" angezeigt. An sich eine recht praktische Sache, nur wundern tuts mich trotzdem
Hat wer dazu ein paar Worte? Seit Wann und warum ist das so?
-
Bei den streams werden bei Lese- oder Schreibfehlern standardmäßig nur die Fehlerflags gesetzt (fail, bad) die du auch abfragen kannst. Damit eine exception geworfen wird mußt du das mittels basic_ios::exceptions separat einschalten.
-
iostate
exceptions() const;Returns a mask that determines what elements set in rdstate() cause exceptions to be thrown.
void
exceptions(iostate except);Sets the exception mask to except, then calls clear(rdstate()).
Kann damit leider nicht so viel anfangen. Hat jemand ein Code-Beispiel für mich?
-
std::cin.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit ); double eingabe = 0; try { std :: cout << "Die Zahl:" << std :: endl; std :: cin >> eingabe; } catch(iostream::failure e) { std :: cout << e.what() << std :: endl; }
-
Ahh gut danke euch beiden! Mal wieder was gelernt
