Exception Handling
-
Hallo folgende Aufgabe hab ich mir heute zu Gemüte geführt:
**Gegeben sei folgendes Programmfragment:
void DatEin(const char *dateinname, ifstream &eindat) { eindat.open(dateinname); if(!dateiname) { cout <<“Fehler beim Öffnen der Datei“; exit(1); } } int main() { ... ifstream eindat; DatEin (“test.dat“, eindat); return 0; }Verändern Sie die Funktion und die main-Funktion durch Einsatz des Exception-Handling so, dass die Ausgabe der Fehlermeldung und der Aufruf exit(1) durch Auswerfen einer Exception ersetzt und diese Exception abgefangen werden kann.
**Ok hier mein Lösungsvorschlag
void DatEin (const char *dateiname, ifstream &eindat) { eindat.open(dateiname); if(!eindat) //Falls Zugriff false { throw “Fehler beim Oeffnen der Eingabedatei!“; } } int main() { ... ifstream eindat; try { DatEin (“test.dat“, eindat); } catch { cout <<“Fehler beim Oeffnen der Eingabedatei “; exit(1); } return 0; }und die Frage würde das hier auch gehen wenn ich z.B.
throw 1;und im catch Block unten
catch(int) { cout<<"Fehler..."; }schreibe.
-
Warum probierst du es nicht einfach aus?

-
PuppetMaster2k schrieb:
Warum probierst du es nicht einfach aus?

Muss man sich eigentlich für alle Theoriefragen rechtfertigen ? Das was da steht, steht momentan bei mir auf Papier, ich versuch das erst zu verstehen UND dann teste ich das aus. Ein Compiler sagt sofort richtig oder falsch aber unter Umständen weisst du nicht wieso. Denk drüber nach...
-
Aber wenn du es ausprobierst, wird die den Effekt sehen und kannst dir auch selbst das Verhalten erklären.
Was ist daran zu "Experimentieren"??? Macht jeder Wissenschaftler.
-
Na gut nachdem hier ja nur blöd rumdiskutiert wird -> anderes Forum
-
Hallo,
prinzipiell kannst du einen Integer werfen und fangen. Tun solltest du das aber nicht. Primitive Typen (inklusive Strings) sind als Exception-Typen nicht gut geeignet, da sie selbst keinerlei Bedeutung mittragen.
-
Dai schrieb:
Na gut nachdem hier ja nur blöd rumdiskutiert wird -> anderes Forum
tschüss

-
Dann lies es halt im Standard nach.

-
Artchi schrieb:
Aber wenn du es ausprobierst, wird die den Effekt sehen und kannst dir auch selbst das Verhalten erklären.
Was ist daran zu "Experimentieren"??? Macht jeder Wissenschaftler.
Jeder Wissenschaftler... dann frag mal einen Mathematiker.
-
.. um mal auf's Thema zurück zu kommen. Im C++-Standard sind für Exceptions bestimmte Klassen vorgesehn, die alle von std::exception abgeleitet sind.
Man unterscheidet grob zwischen Runtime-Fehlern und logischen Fehlern. Logische Fehler sind theoretisch vermeidbar. Runtime-Fehler sind solche, die meist auf Grund äußerer Einflüsse einfach auftreten können, und dazu gehört auch das Fehlschlagen von Open-File.Im Prinzip sollte der Code so aussehen:
#include <iostream> #include <fstream> #include <stdexcept> // std::runtime_error; std::logic_error; u.a. void DatEin (const char *dateiname, std::ifstream &eindat) { eindat.open(dateiname); if(!eindat) //Falls Zugriff false { throw std::runtime_error( "Fehler beim Oeffnen der Eingabedatei!" ); } } int main() { using namespace std; ifstream eindat; try { DatEin ("test.dat", eindat); } catch( const std::exception& err ) { cerr << "Exception: " <<err.what() << endl; return 1; } return 0; }Gruß
Werner
-
einDat.exceptions(std::ios::badbit);
-
templäd schrieb:
Artchi schrieb:
Aber wenn du es ausprobierst, wird die den Effekt sehen und kannst dir auch selbst das Verhalten erklären.
Was ist daran zu "Experimentieren"??? Macht jeder Wissenschaftler.
Jeder Wissenschaftler... dann frag mal einen Mathematiker.
Mathematiker rechnen auch viel einfach mal los und gucken dann, ob es hinhaut oO