try+catch - Was geht da nicht?



  • Hallo!
    Ich habe mir den Code schon mindestens 2000 mal durchgelesen und kann den Fehler einfach nicht finden:

    try
    {
    Memo1->Lines->LoadFromFile("C:\\Program Files\\mySoftware\\design.txt");
    }
    catch(...)
    {
    _mkdir("c:\\Program Files\\mySoftware");
    Memo1->Text = "6";
    Memo1->Lines->SaveToFile("C:\\Program Files\\mySoftware\\design.txt");
    }
    

    Passt eigentlich, oder?
    Aber da der Ordner mySoftware (möglicherweise) noch nicht existiert, kann die Datei nicht geladen werden, deshalb die try+catch-Struktur.
    Ich bekomme aber trotzdem eine Fehlermeldung hingeknallt, dass die Datei nicht geladen werden kann, warum??

    Danke,
    Harald1 🕶



  • Hi,

    also so komplett ohne den Zusammenhang, ist das nur sehr spekulativ zu beantworten...
    Ich habe z.B. keine Ahnung, was "Memo1" macht, wenn einmal vergeblich versucht wurde, zu laden (zum Vgl: std::stream&Co haben ein "Fehlerflag", das nach einem vergeblichen Schreib-/Leseversuch solange gesetzt bleibt, bis es explizit löscht).
    Mir fallen auf:
    - Was ist eine "...hingeknallte Fehlermeldung.." ? Was bedeutet das eigentlich? Fliegt eine exception? Kommt eine Ausgabe (vllt. schreibt LoadFromFile() selbst was raus) ? ...
    - Wer sagt eigentlich, dass diese Fehlersituation von LoadFromFile() ausgelöst wird? Sie könnte genauso von SaveToFile() oder operator=(int) von "Text" oder .... kommen.
    - alle Exceptions zu fangen und auf diese sehr spezielle Form gleich zu behandeln (Verzeichnis anlegen), ist nicht nur unschön, sondern führt genau zu Deinem Problem: Du weißt nicht mehr was eigentlich wo schiefgelaufen ist. Besser: genau DIE Fehlersituation abfangen, die man handlen will (hier: "NoSuchDirectoryException" 😉 ) und alle anderen weiterrauschen lassen. Man kann sie immer noch im "Rahmen" (main() oder so) protokollieren ... aber ein "Ach ich weiß schon; das kann ja eigentlich nur xyz sein!" zeugt meistens nur von einer begrenzten Phantasie. 😉
    - Warum die ganze "Zeigerei"? 😮 Das riecht mir ein wenig nach ziemlich unnötigem Rumgewurstel...

    Gruß,

    Simon2.



  • Vielleicht zeigt "LoadFromFile" einfach eine MessageBox an, bevor es eine Exception wirft (wäre zwar sehr doof, aber sicher nicht so doof dass ich nicht schon dooferes gesehen hätte).
    Oder vielleicht wirft "LoadFromFile" ja überhaupt garkeine Exception...



  • Hallo,
    also bei Programmstart, wird dieser Code ausgeführt. Das Programm startet und wird gleich mit der Meldung (in einer MessageBox):

    Im Projekt Projekt1.exe ist eine Exception EFOpenError aufgetreten. Meldung: 'Datei C:\Program Files\mySoftware\design.txt kann nicht geöffnet werden'. Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen.

    Nur zur Erklärung: Dass der Text von Memo1 dann "6" ist, sagt meinem Programm nur welches Design es wählen soll, das ist aber glaube ich unwichtig, oder?

    Danke,
    ➡ Halrald1



  • Die Meldung verursacht der Debugger, der dich über das Auftreten einer Exception benachrichtigt, nicht dein Programm selbst. Das geht aber sowohl aus dem Fenstertitel der Meldung als auch aus deren Status als modales Dialogfenster der IDE eindeutig hervor.

    Weiterhin solltet du - wie Simon2 dir zu Recht vorhält - nicht einfach alle Exceptions fangen, sondern nur EFOpenError. Dein Programm versucht sonst, Ordner und Datei zu erstellen unabhängig von der Fehlerursache, also z.B. auch, wenn LoadFromFile() nicht genügend Speicher erhält, um die Datei laden zu können.

    Simon2 schrieb:

    - Warum die ganze "Zeigerei"? 😮 Das riecht mir ein wenig nach ziemlich unnötigem Rumgewurstel...

    Es handelt sich um eine visuelle Komponente in C++Builder; diese können nur auf dem Heap erstellt werden, daher werden Zeiger benutzt.

    Und bevor du fragst: es ist trotzdem exceptionsicher. Die Objekte werden vom Streaming-System via virtuellem Konstruktor erstellt und vom übergeordneten, "besitzenden" Formular verwaltet.



  • audacia schrieb:

    ...

    Simon2 schrieb:

    - Warum die ganze "Zeigerei"? 😮 Das riecht mir ein wenig nach ziemlich unnötigem Rumgewurstel...

    Es handelt sich um eine visuelle Komponente in C++Builder; diese können nur auf dem Heap erstellt werden, daher werden Zeiger benutzt....

    Aha!!
    Danke - ich programmiere immer komplett GUI-frei und da kenne ich sowas nicht.

    audacia schrieb:

    ...Und bevor du fragst: es ist trotzdem exceptionsicher. ..

    hätte ich jetzt gar nicht nach gefragt, weil das irgendwie nicht so in den Aufgabenbereich des Nutzers fällt.
    Mein Problem mit Zeigern ist eher die Frage der "Verantwortung": Wenn man munter Zeiger (oft notgedrungerweise non-const) rumreicht, kommt immer irgendeiner auf die Idee, das Teil zu löschen oder zu unerwartet verändern oder ....
    Sowas sollte eine gute API halt sauber regeln - aber das tut sie ja vielleicht auch.

    Und nun habe ich weider was gelernt - Danke,

    Simon2.


Anmelden zum Antworten