hier gefangen werden können, ist ein einfaches Beispiel für die AnwendungSchub time_facet eine Ausnahme verursacht, die nicht
#include <string>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
try
{
auto date = boost::posix_time::microsec_clock::local_time();
// boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%d-%b-%Y %H:%M:%S"); --> this format works
boost::posix_time::time_facet* facet = new boost::posix_time::time_facet("%d-%b-%Y %k:%M:%s"); // --> this format causes an exception that can't be handled
std::stringstream ss;
ss.imbue(std::locale(ss.getloc(), facet));
//ss.exceptions(std::ios::badbit | std::ios::failbit);
ss << date; // --> exception occurs here - It can't be caught.
std::cout << ss.str() << std::endl;
}
catch (const std::exception& ex)
{
std::cerr << "std::exception " << ex.what() << std::endl;
}
catch (const boost::exception&)
{
std::cerr << "boost::exception " << std::endl;
}
catch (...)
{
std::cerr << "unknown exception" << std::endl;
}
return 0;
}
Das Problem ist, mit einem bestimmten Format an die Facette bestanden - entweder% k oder% l das Problem verursachen. Wenn ein Datum in diesem Format formatiert wird, gibt es eine Ausnahme. Die Exception wird nicht vom Exception-Handler abgefangen - das Programm wird beendet!
Ich erstelle eine Bibliotheksfunktion, so dass ich annehmen muss, dass ungültige Formatzeichenfolgen vorkommen. Ich bin in Ordnung mit einer Ausnahme - ich muss nur in der Lage sein, damit umzugehen und den Fehler zu melden oder zu bestätigen, dass die Facette gültig ist, bevor ich sie benutze.
Dies geschieht unter Windows 10. Der Fehler ist in der Funktion wcsftime. Auch wcsftime ist eine breite Char-Funktion, und ich verwende 8 Bit Char. Die Anwendung wird in Visual Studio 2017 mit MultiByte-Zeichensatz anstelle von Unicode kompiliert.
Das Problem tritt in dem Debugger mit der obigen Aussage. Das Ausführen des Releasebuilds über die Befehlszeile führt zum Absturz der Anwendung und zum Aufrufen des Windows-Dialogfelds "Anwendung hat aufgehört zu arbeiten".
Die Boost-Version ist 1.65.1
Was mache ich falsch?
Das ist eine Behauptung, keine Ausnahme. Eine Behauptung bedeutet einen Fehler. – chris
Sie können keine Assertionsfehler abfangen. (Nun, Sie könnten wahrscheinlich, aber nicht wie Ausnahmen, und Sie sollten nicht.) Behauptungen sind da, um Programmierer Fehler zu erkennen, Sie sollen den Fehler beheben, nicht zur Laufzeit wiederherstellen. –
Ich sehe keine Möglichkeit, vorher zu prüfen, ob ein Format gültig ist, durch Boost oder durch 'strftime'. Es ist bedauerlich, dass es eine Behauptung geben würde, die keinen einfachen Weg hat, sie zu verhindern. Es ist wahrscheinlich, dass das Format eine fest codierte Sache war und nicht etwas, das mit unbekannter Eingabe erstellt wurde. Von der Zusicherungsbedingung scheint es, dass die Implementierung es auch nicht an der Vorderseite prüft, wahrscheinlich, weil es einen Teil der Arbeit duplizieren würde, den die Funktion bereits zu tun hat. – chris