RoflCopter Geschrieben 4. September 2009 Teilen Geschrieben 4. September 2009 Hallo Community, ich würde gerne, bevor ich eine Datei öffne - prüfen ob diese vorhanden ist - klar dies geht mit (!if), aber gibt es eine Möglichkeit dies auch mit einem try {}, catch {} block zu regeln? Ebenso würde ich gerne bevor ich eine Datei erstelle prüfen ob genug Speicherplatz vorhanden ist, bzw. ob Rechte vorhanden sind / Ordner vorhanden ist. Mein Problem ist es, dass ich nicht weiß wie ich alle möglichen Fehler abfangen kann UND! den dazugehörigen Errorcode bzw. das was vom Betriebssystem ausgespuckt wird ( z.B. "Ordner existiert nicht" ) Mein bisheriger Wissenstand: try { // Anweisungen welche Fehler verursachen können. // z.B. Division by Zero // int z1 = 2; // int z2 = 0; //z1 = z1 / z2; } catch (...) { // So weit ich gelesen habe steht "..." für alle //möglichen Fehler // Wie gebe ich hier den Fehlercode aus? Irgendwas mit //err.description vll.? } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 4. September 2009 Teilen Geschrieben 4. September 2009 Hi, geht schon, nur du musst sagen, für was eine Exception geschmissen werden soll: #include <fstream> #include <iostream> #include <exception> using namespace std; int main () { ifstream file; file.exceptions( ifstream::failbit ); try{ file.open ("blah.fasel", fstream::in ); } catch (const exception &e) { cout << e.what() << endl; } file.close(); return 0; } Wenn die Datei nicht gefunden wird, wird das failbit gesetzt. Normalerweise wird keine Exception geschmissen, wenn du die aber mit file.exceptions( ifstream::failbit ); aktivierst, schon. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. September 2009 Teilen Geschrieben 4. September 2009 ich würde gerne, bevor ich eine Datei öffne - prüfen ob diese vorhanden ist - klar dies geht mit (!if), aber gibt es eine Möglichkeit dies auch mit einem try {}, catch {} block zu regeln?Schreib ein throw in den if-Block mit der Prüfung. Mal im Ernst, wozu? Exceptions sind für unvorhergesehene Situationen gedacht. Man kann sie für die Ablaufsteuerung benutzen, aber das ist eigentlich nicht Sinn der Sache. Ebenso würde ich gerne bevor ich eine Datei erstelle prüfen ob genug Speicherplatz vorhanden ist, bzw. ob Rechte vorhanden sind / Ordner vorhanden ist. Mein Problem ist es, dass ich nicht weiß wie ich alle möglichen Fehler abfangen kann UND! den dazugehörigen Errorcode bzw. das was vom Betriebssystem ausgespuckt wird ( z.B. "Ordner existiert nicht" )Da wirst du auf betriebssystemspezifische Funktionen zurückgreifen müssen, der C++-Standard deckt das nicht ab. catch (...) { // So weit ich gelesen habe steht "..." für alle //möglichen Fehler // Wie gebe ich hier den Fehlercode aus? Irgendwas mit //err.description vll.? } Wenn du mit ... fängst, hast du keine Möglichkeit, an einen Fehlercode zu kommen. Außerdem fängt das keine Fehler wie Schutzverletzungen oder Division durch Null, außer bei gewissen nicht standardkonformen Compilern (MSVC). Auch dafür gibt es dann betriebssystemspezifische Funktionen. Die Exception-Basisklasse der C++-Standardbibliothek (std::exception) hat eine what-Methode, über die du einen Meldungstext bekommen kannst. Alle Exceptions der Standardbibliothek erben von dieser Klasse. Exceptions [C++ Reference] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. September 2009 Teilen Geschrieben 4. September 2009 Mal im Ernst, wozu? Exceptions sind für unvorhergesehene Situationen gedacht. Man kann sie für die Ablaufsteuerung benutzen, aber das ist eigentlich nicht Sinn der Sache. Eigentlich kann man jeden Ablauf vorher so optimieren, dass nie eine Excepion auftreten wird. Von daher ist das eher Geschmackssache, ob ich z.B. aus einer openFile-Methode ein bool zurückgeb oder eine Exception werfe. Es gibt sogar Menschen, die werfen bei einer falschen Texteingabe eine Exception aus dem Datenobjekt, fangen diese an der Oberfläche mit einer Messagebox ab und nerven die armen User mit aufpoppenden Fenstern. :floet: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. September 2009 Teilen Geschrieben 4. September 2009 Eigentlich kann man jeden Ablauf vorher so optimieren, dass nie eine Excepion auftreten wird.Es ging mir nicht um Exceptions an sich, sondern um solche Konstrukte: try { if( !failing_function() ) throw x; } catch(...) { // Fehlerbehandlung }[/code]Hier ist die Exception nur ein besseres goto. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 4. September 2009 Teilen Geschrieben 4. September 2009 achso, ich hab da jetzt eher sowas rausgelesen: try { int test = 1/0; } catch(...) { TRACE("Division by zero"); } throw im catch ist Rotz, das stimmt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 5. September 2009 Teilen Geschrieben 5. September 2009 throw im catch ist Rotz, das stimmt. Das kann ich leider so nicht stehen lassen. Es macht durchaus in vielen Fällen Sinn, bei der Kommunikation über mehrere Schichten aus technischen Exceptions fachliche zu machen. So will ich in der Persistenzschicht durchaus eine Verbindungsausnahme fangen, gebe aber an die aufrufende Schicht eine fachliche Exception zurück, in der ich evtl. noch die technische kapsel. Peter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 5. September 2009 Teilen Geschrieben 5. September 2009 Stimmt, eine Exception im catch Block weiterzuschmeißen oder eine andere zu schmeißen ist ganz normale Vorgehensweise. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2009 Teilen Geschrieben 16. September 2009 Das kann ich leider so nicht stehen lassen. Es macht durchaus in vielen Fällen Sinn, bei der Kommunikation über mehrere Schichten aus technischen Exceptions fachliche zu machen. So will ich in der Persistenzschicht durchaus eine Verbindungsausnahme fangen, gebe aber an die aufrufende Schicht eine fachliche Exception zurück, in der ich evtl. noch die technische kapsel. Peter Hoppla, ich seh grad, dass ich mich verschrieben hatte. (Reichlich früh gemerkt, ich weiß). :floet: Ich meinte eigentlich ein throw im try, wenn die Exception im catch nicht weitergeleitet(und/oder geschachtel) wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.