Zum Inhalt springen

C++ try, catch, throw


RoflCopter

Empfohlene Beiträge

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.?

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...
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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...