Frage zu Exceptions



  • Grüß Dir,

    ich habe ne simple Frage, benutze den Borland C++Builder 6 und hab ein kleines Project in dem ich zum speichern von ein paar Einstellungen die TIni Komponente verwende. Nu kann ess ja passieren das zum Beispiel der Schreibvorgang nicht funktioniert und dann meckert diese Komponente und gibt eine Exzeption aus.

    Diese Exzeption unterdrücke ich in einer try-catch-Anweisung.

    //unterdrücken der Exzeption mit try-catch-Anweisung
            try
            {
                    //speichern in der ini Datei
                    TIniFile *ini;
                    ini = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"  ));
                    ini->WriteString("Optionen", "TEST", Edit_SuchFeld->Text);
                    delete ini;
            }
            catch(...)
            {
                    ;
            }
    

    kann man das auch irgendwie im Compiler einstellen oder muss ich jedesmal in allen meinen programmen diese try-catch-Anweisung dafür benutzen ?



  • Nein, das kann man nicht im Compiler einstellen, und ja, das muss man jedes Mal so behandeln. Aber du solltest das auch schon richtig machen, dein Code erzeugt im Falle einer Exception ein Speicherleck, weil das TIniFile Objekt nicht gelöscht wird. Entweder ordnest du deinen Quelltext entsprechend oder du benutzt smart Pointer, um VCL Objekte handzuhaben:

    void MyClass::someFunc()
    {
       TIniFile* ini = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"  ));
       try
       {
          ini->WriteString("Optionen", "TEST", Edit_SuchFeld->Text);
       }
       catch( Exception& Excp )
       {
       }
       delete ini;  // muss immer aufgerufen werden, wenn das Objekt auf dem Heap erzeugt worden ist!
    }
    


  • Wäre das nicht auch mit 'try' 'finally' möglich?

    TIniFile* ini = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"  ));
       try {
          ini->WriteString("Optionen", "TEST", Edit_SuchFeld->Text);
       }
       __finally {
          delete ini;
       }
    


  • Ja, das __finally sollte auch gehen.



  • Dann also noch die Variante mit SmartPointer

    void MyClass::someFunc() 
    { 
       try 
       { 
          std::auto_ptr<TIniFile> ini(new TIniFile(ChangeFileExt(Application->ExeName, ".ini"  ))); 
          ini->WriteString("Optionen", "TEST", Edit_SuchFeld->Text); 
       } 
       catch( Exception& Excp ) 
       { 
       }  
    }
    


  • Danke an alle, ihr habt mir sehr geholfen.

    Wie kann man denn überprüfen ob ein Programm ein Speicherleck verursacht ?
    Gibts da irgendwie Monitoring Tools für ?



  • Ja, das RAD Studio bringt den CodeGuard mit. Guck´ mal in den Projektoptionen unter Debugging, da kannst du unter CodeGuard(tm) Optionen einstellen, was du überwachen möchtest.



  • C++ Spion schrieb:

    Wäre das nicht auch mit 'try' 'finally' möglich?

    TIniFile* ini = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"  ));
       try {
          ini->WriteString("Optionen", "TEST", Edit_SuchFeld->Text);
       }
       __finally {
          delete ini;
       }
    

    Wohlgemerkt unterscheidet sich die Semantik hier von try/catch : __ finally räumt nur kurz auf und wirft die Exception dann weiter, catch(...) verschluckt sie.

    Es hängt natürlich vom Anwendungsfall ab, aber ich fände es sinnvoller, wenn der Benutzer eine Fehlermeldung sieht. Das ist der Fall, wenn du die Exception einfach weiterfliegen läßt.

    Außerdem solltest du keine Dateien ins Anwendungsverzeichnis schreiben, weil du dort spätestens seit Vista keine Schreibrechte mehr hast. Mach dir einen Ordner unter %APPDATA% und speichere dein Zeug dort.



  • [quote="audacia|off"]

    C++ Spion schrieb:

    Außerdem solltest du keine Dateien ins Anwendungsverzeichnis schreiben, weil du dort spätestens seit Vista keine Schreibrechte mehr hast. Mach dir einen Ordner unter %APPDATA% und speichere dein Zeug dort.

    Ach echt ? hört sich ja grauenvoll an, zum Glück benutz ich so komische Betriebssysteme nicht.

    Aber Fehlermeldungen sind schon wichtig ganz klar, nur sind diese meist unschön wenns durch ne Exception geschieht. Hab da ganz böse Erfahrungen mit der TADOQuery Komponente gemacht, diese hässlichen Exceptions plagen mich schon sehr lange, ich bins leid jedesmal try catch etc.



  • [quote="DAU_2013"]

    audacia|off schrieb:

    C++ Spion schrieb:

    Außerdem solltest du keine Dateien ins Anwendungsverzeichnis schreiben, weil du dort spätestens seit Vista keine Schreibrechte mehr hast. Mach dir einen Ordner unter %APPDATA% und speichere dein Zeug dort.

    Ach echt ? hört sich ja grauenvoll an, zum Glück benutz ich so komische Betriebssysteme nicht.

    Und was ist, wenn jemand anderes dein Programm benutzt und Windows 7/8 benutzt?



  • DocShoe schrieb:

    Und was ist, wenn jemand anderes dein Programm benutzt und Windows 7/8 benutzt?

    Ich programmier zu 99% nur für mich, sehr selten geb ich auch mal was weiter und wenns dann nich läuft weil er ein Krüppel OS benutzt dann hat er pech gehabt, programmiere doch nicht mein ganzes lebenlang die Tools um weil MS scheisse baut.

    Ich kann doch auch nix dafür das sich ein OS Vista/Win7 welches für eine SpielConsole geschrieben wurde aufm IBM durchsetzt.

    Ein gutes Beispiel hierfür ist das Desaster mit den IE natürlich MS wer sonst, und jeder Webdesigner backt für den IE eine extra Wurst und das für alle Versionen. Das leben wäre einfacher ohne diese MS Produkte aber leider hat die Masse anders entschieden.

    Das ist meine Meinung zu dem Thema und nicht böse gemeint.



  • DAU_2013 schrieb:

    DocShoe schrieb:

    Und was ist, wenn jemand anderes dein Programm benutzt und Windows 7/8 benutzt?

    Ich programmier zu 99% nur für mich, sehr selten geb ich auch mal was weiter und wenns dann nich läuft weil er ein Krüppel OS benutzt dann hat er pech gehabt, programmiere doch nicht mein ganzes lebenlang die Tools um weil MS scheisse baut.

    Ich kann doch auch nix dafür das sich ein OS Vista/Win7 welches für eine SpielConsole geschrieben wurde aufm IBM durchsetzt.

    Ein gutes Beispiel hierfür ist das Desaster mit den IE natürlich MS wer sonst, und jeder Webdesigner backt für den IE eine extra Wurst und das für alle Versionen. Das leben wäre einfacher ohne diese MS Produkte aber leider hat die Masse anders entschieden.

    Das ist meine Meinung zu dem Thema und nicht böse gemeint.

    Man merkt´s sofort, ein Fachmann!



  • DocShoe schrieb:

    Man merkt´s sofort, ein Fachmann!

    Ich muss niemanden was beweisen, so wie ich das für mich handhabe tut das auch niemanden weh, es kommt niemand dabei zu schaden. Wenn ich Vista/Win7/Win8 für den letzten Müll halte musst sich keiner damit identifizieren es ist meine Meinung und die wird sich nie ändern.

    Habe das OS mit dem ich glücklich bin das genügt mir. Softwaremäßig fehlt es mir so gut wie an gar nix, brauch auch kein neues Krüppel-OS welches mir dieses oder jenes verbietet, auf diesen Fortschritt ins Mittelalter kann ich verzichten.



  • DAU_2013 schrieb:

    es ist meine Meinung und die wird sich nie ändern

    Schonmal über eine Karriere in der Politik nachgedacht? 🙂


Log in to reply