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_50Das 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!