Fehler abfangen
-
Hallo,
ich bin gerade dabei, mich in die Fehlerbehandlung einzuarbeiten. Was ich nicht so recht verstehe. Ich setze den code in einen try,catch Block und werfe eine Ausnahme mit Throw. Soweit, so gut. Ich kenne das aus VB, dass es ein Error Objekt gibt, das man fragen kann, welchen Fehlercode der Fehler hat. Dementsprechend kann ich dann den Fehler behandeln. Gibts es das in C++ auch? Wie krieg ich raus, welcher Fehler eingetreten ist? zum Biepsiel habe ich das Problem, dass ich eine Zahl erwarte als Eingabe, und wenn nun ein String eingegeben wird,welchen Datentyp muss dann die Ausnahme werfen? Um auf den Fehler zu reagieren, muss ich doch den Fehler erstmal indenfizieren, oder?
Kann mir jemand auf die Sprünge helfen bitte?danke...
paloncino
-
Du mußt dann ein Objekt deiner Wahl werfen, wenn es kein bestimmtes gibt. Du kannst aber auch eigene Exceptions definieren, die du wirfst.
http://www.kharchi.de/cppratgeber3.htm
Vielleicht hilft das weiter?
-
Hallo,
dake für den Link. Der hat es ein wenig klarer gemacht. Also gibt es ein Exeption Objekt. Das kenn ich von Java. Aber wenn ich nicht weiss vorher, welcher Fehler auftauchen kann, es muss doch eine Möglichkeit geben, dass mir das Programm sagt, mit welchem Fehler ich es zu tun habe. Dann kann ich hin auch korrekt behandeln. In VB ist das ein Fehlercode und man kann in einer Tabelle nachgucken, worum es geht. Dann kann ich den Fehler individuell behandeln bzw eine aussagekräftige Fehlermeldung an den Anwender rausgeben.
Exceptin ist ja wahrscheinlich das Mutterobjekt, nehm ich an. Wahrscheinlich werdne doch alles möglichen Fehler davon abgeleitet. Gbit es eine Übersicht davon und wie krieg ich das Prgramm dazu, mir eben dies mitzuteilen? Mein Programm stürzt einfach ab und sacht mir gar nix. Exe hat einen Fehler verursacht und basta.Grüße
paloncino
-
machs dir doch so:
wenn du ein objekt erstellst:
int b; if(!b){std::cout << "int b konnte nicht erstellt werden" << std::endl;};
beim öffnen einer datei:
file.open("blabla.txt"); if(!file){std::cout << "datei blabla.txt konnte nicht geöffnet werden" << std::endl;};
und für die überprüfung der eingabe könntest du ja auch mit getch() (oder so) und der ascii-tabelle arbeiten (sag ja nicht das es schnell gehen wird, aber funktionieren tut es allemal)
-
es ist einfach: schau in der docu zur bibliothek nach. in guten dokus steht das immer dabei. ansonsten kannst du auch schauen, ob die benutzten funktionen ein throw(...) in der funktions deklaration haben, alles was in den klammern steht sind exceptions die geworfen werden können. Das macht aber sogut wie niemand, da es nichts bringt ausser schreibarbeit(und probleme, wenn man nachträglich irgendwelche komponenten mit exceptions ausstattet).
und im zweifelsfall machst du einfach das in deiner main:
int main(){ try{ //das programm } catch(...){ cout<<"ein kritischer fehler ist aufgetreten"; //... } }
denn normalerweise kann man an der stelle eh nichts mehr machen, wenn zb "new" eine exception wirft, weil kein speicher mehr allokiert werden kann ist eh alles verloren
Exception ist ja wahrscheinlich das Mutterobjekt, nehm ich an. Wahrscheinlich werdne doch alles möglichen Fehler davon abgeleitet.
nein,du kannst alles werfen, gibt keine ableitungspflicht.
@enno-tyrant hier gehts um exceptions und nicht um die veraltete c-fehlerbehandlung
//edit
int b; if(!b){std::cout << "int b konnte nicht erstellt werden" << std::endl;};
muhaha ich will ma ein programm sehen, in der dieser fehler ausgelöst werden kann.
-
paloncino! Was geworfen werden kann, kannst du an mehreren Dingen sehen:
1. an einer Dokumentation der entsprechenden Funktion/Klasse,
2. am Sourcecode.
3. Wenn du Pech hast, wirst du es nirgends sehen können.
4. Manchmal treten Exceptions auf, die von Funktionen/Klassen garnicht gewollt sind. Das sind dann aber schlecht programmierte Sachen.Du siehst, es ist nicht ganz so einfach. Am optimalsten ist natürlich Variante eins. Schön dokumentiert und man weiß was man abfangen kann. Oder Variante 2. Variante 4 dürfte wohl am häufigsten vorkommen, leider!
Die Standard-Library std:: und die Sprache C++ selbst werfen Exceptions, die ich gaaanz unten im verlinkten Artikel aufgeführt habe. Schau da bitte nochmal rein.
Die boost-Libarary z.B. hat alles schön dokumentiert. Beispiel:
http://www.boost.org/libs/filesystem/doc/index.htm
Rechts sind sowohl die Klassen als auch die möglichen Exceptions die von boost::filesystem geworfen werden können aufgeführt. Die Dokumentation ist aber in meinen Augen leider bzgl. Exceptions auch noch nicht perfekt. Aber besser als nichts.
Wenn du eine Exception fängst, die vom Typ std::exception ist, kannst du dir den Fehler ausgeben lassen (einen Error-Code gibt es in dem Sinne nicht, da der Exception-Typ der ErrorCode ist):
catch(std::exception &e) { std::cout << e.what() << std::endl; }
Das würde dir einen Fehlertext ausgeben, mit dem man sogar meistens was anfangen kann. Einen ErrorCode hat std::exception nicht. Weil Worte mehr als eine nichtssagende Zahl aussagen. Du sagst ja selbst: für den Errorcode muß du in einer Tabelle nachschlagen. Das ist ja ganz mies. Bei e.what() bekommst du eine schriftliche Erklärung die du nicht mehr nachschlagen mußt!
Beim boost-Filesystem gibt es einen ErrorCode, weil er vom Designer der Exception so gewollt ist, schau dir den Header mal genauer an:
http://www.boost.org/libs/filesystem/doc/exception.htm
Abfangen:
catch(boost::filesystem::filesystem_error &e) { std::cout << e.what() << ", errorcode: " << e.error() << std::endl; }
Du kannst, wie filesystem_error auch eigene Exceptions definieren und diese werfen. Und wie gesagt, bei fremden Libraries kann es im schlimmsten Fall sein, das niemand weiß, was geworfen wird. Dann mußt die radikale Methoden anwenden:
catch(...) { std::cout << "Unbekannte Exception!" << std::endl; }
Das ... bedeutet: fange ALLES ab. Sollte aber natürlich nur eine Notlösung sein, da man damit nicht wirklich was anfangen kann. Man kann nur den totalen Abbruch seiner Anwendung verhindern.
-
...muhaha ich will ma ein programm sehen, in der dieser fehler ausgelöst werden kann...
, will ja gar nichts gesagt haben