Fehlerhandling try/catch



  • Hi!
    Frage 1: Warum bricht mein Programm ab, anstatt in den catch-Block zu laufen?!

    int l_anzahl = 0;
    try {
    	int l_anzahl = GetPrivateProfileInt("Anzahl", "anzahl", 0, a_inifile );
    } catch (...) {
    	cout << "Anzahl konnte nicht ermittelt werden. Ist die appStart.txt vorhanden? " << a_inifile << endl;
    }
    

    '...' sollte doch eigentlich alles abfangen.

    Frage 2: Wenn ich konkrete Exceptions abfangen möchte, wie bekomme ich heraus, welche in meinem try-Block überhaupt auftreten können?

    thx :p



  • @1: Nicht jeder Fehler äußert sich in einer Exception - manche greifen auch gleich zu härteren Maßnahmen (assert() oder abort()). Worüber genau stolpert denn dein Programm?

    @2: Am einfachsten in der Dokumentation der Funktion (bei STL-Funktionen kannst du auch prophylaktisch 'std::exception&' auffangen, MS-Funktionen schmeißen normalerweise Nachkommen von Exception).



  • Wenn(!) eine Exc. geworfen wird, kann man mit der Ausgabe von what() Einzelheiten anzeigen lassen, z.B.

    ...
    catch(const std::exception& e) { // Alle C++-Exc.-Klassen erben von exception
      std::cout << e.what() << std::endl;
    }
    

    Wie gesagt, wenn. what() ist virtual und (hoffentlich) für abgeleitete Klassen redefiniert.



  • GetPrivateProfileInt wirft keine Exceptions (niemals), daher wirst du auch keine fangen können. Eigentlich ganz einfach.



  • hustbaer schrieb:

    GetPrivateProfileInt wirft keine Exceptions (niemals), daher wirst du auch keine fangen können. Eigentlich ganz einfach.

    OK, dachte ich mir fast, ich bekomme auch einen unerlaubten Speicherzugriff, nur, weil die gesuchte Datei nicht da ist.
    Wie auch immer ich den Fall jetzt behandle, ich hatte halt gehofft, dass ich nur die korrekte Exception kennen muss, so alias FileNotFound in Java....

    Wie verhindere ich denn an der Stelle den Abbruch, z.B. durch das Fehlen der Datei? Ich vermute mal, dass ich wirklich nur prüfen kann, ob die Daten vorhanden ist. Andere Abbruchursachen kann ich also nicht ohne vorherige Kenntnis abfangen, oder?!
    Ich würde schon gern an der Stelle kontrolliert abbrechen und zumindest eine ungefähre Fehlermeldung ausgeben.



  • GetPrivateProfileInt erzeugt auch keine access violation nur weil eine Datei nicht da ist, sondern liefert stattdessen den übergebenen Defaultwert zurück.
    Wenn du eine access violation bekommst liegt das vermutlich daran dass a_inifile Schrott enthält (z.B. nicht nullterminierter String oder sonstwas).



  • hustbaer schrieb:

    GetPrivateProfileInt erzeugt auch keine access violation nur weil eine Datei nicht da ist, sondern liefert stattdessen den übergebenen Defaultwert zurück.
    Wenn du eine access violation bekommst liegt das vermutlich daran dass a_inifile Schrott enthält (z.B. nicht nullterminierter String oder sonstwas).

    An den Default-Wert hatte ich ja gar nicht mehr gedacht!
    Die Access-Violation kommt aber immer dann, wenn ich die Datei auf einen ungültigen Namen umbenenne!
    Naja, jetzt teste ich halt vorher, ob sie da ist.


Anmelden zum Antworten