Boost Exceptionhandling



  • Hallo zusammen,
    im debuging Prozess meiner Anwendung bin ich auf ein Problem gestoßen, wo es nicht möglich ist mit "try & catch" Exceptions im Umgang mit Boost abzufangen.

    Folgende einfache Funktion wird ausgeführt und scheitert mit einer path_traits Exception falls der angegebene Pfad ungültig ist, oder wie bei einem Network Share temporär nicht verfügbar sein kann. Wie gesagt scheitert auch die Verwendung von try...catch

    bool ShareBackup::MakeDir(AnsiString path)
    {
    
    		  boost::filesystem::path dir(path.c_str());
    
    		  if(!boost::filesystem::create_directory(dir))
    		  return false;
    
    		  return true;
    }
    

    Die entstehende Exception bringt bei einer ungültigen oder nicht vorhandenen Pfadangabe die vollständige Konsolenanwendung zum Absturz. Wie kann ich das abfangen?



  • Diese Zwischenlösung habe ich nun gefunden und scheint zu tun was es soll. Aber ist dies auch korrekt?

    try
    		{
    		  boost::filesystem::path dir(path.c_str());
    		  boost::filesystem::create_directory(dir);
    		}
    		catch(std::exception &ex)
    		{
    		  return false;
    		}
    
    		return true;
    


  • Ich verwende Boost zum ersten mal und werde nicht besonders schlau aus diesem Paket. Ich versuche nun das Exception Handling, wie es eben am naheliegensten ist mit Boost::Exception zu lösen aber es haut nicht hin:

    #include <boost/exception/all.hpp>
    
    //------------------------------------------------------------------------------
    bool ShareBackup::MakeDir(AnsiString path)
    {
    
    		 try
    		{
    		  boost::filesystem::path dir(path.c_str());
    		  boost::filesystem::create_directory(dir);
    		}
    		catch(boost::exception &ex)
    		{
    		  return false;
    		}
    
    		return true;
    
    }
    

    Installiert ist der XE6 mit 2 verschiedenen Boost Verzeichnissen:

    Boost_1_39
    Boost_1_50

    Das Einbinden von

    #include <boost/exception/all.hpp>
    

    schlägt fehl da Boost_1_39 verwendet wird und es im Verzeichnis Exceptions keine all.hpp gibt. Diese Datei gibt es nur im Pfad der Version _1_50. Allerdings wird dieser Includepfad wird überall in den Docs vorgegeben.

    Setze ich alle Compilerpfade auf Version _1_50 hagelt es memory errors ohne Ende. Kann es sein das _1_50 die 64-Bit Version ist?



  • Ja, Boost 1.50 ist wohl nur für 64bit: XE6 - Boost Libraries.

    Welche XE-Version verwendest du denn?



  • Der C++ Builder in der 32Bit-Version unterstützt den C++ Standard nur sehr mäßig. Die 64Bit-Version basiert auf einer ganz anderen Compiler-Chain und ist was C++ angeht wesentlich weiter. Daher gibt es zwei Verzeichnisse, die boost-Version 1.39 ist für 32bit, die 1.50 für 64bit. Zudem fehlen aufgrund seiner Einschränkung auch einige Bibliotheken bei der 1.39, die normalerweise enthalten waren.

    So lange 32Bit- und 64Bit-Version nicht auf die gleiche Compiler-Chain umgestellt sind, kann man auch nicht einfach Code zwischen beiden austauschen (Es sei den man schreibt ausschließlich VCL-Code und nutzt auch nur sehr begrenzt die C++ Bibliotheken).



  • Oje, habs befürchtet. In der Firma verwenden wir den XE6 Pro. Habe ein Boost Doc gefunden wo in der 32-Bit Version ausdrücklich std::exception oder im Sonderfall (...) verwendet werden kann/soll. Danke für eure Rückmeldungen!


Log in to reply