2016-11-09 2 views
1

Ich erwäge den Wechsel von Windows auf boost :: filesystem zu verwenden. Die Dokumentation sagt mir jedoch fast gar nichts darüber, wie man aussagekräftige Fehlerinformationen daraus erhält.Wie bekomme ich die Bedeutung von Fehlercodes von boost :: filesystem :: filesystem_error

Für ein schnelles Beispiel habe ich die folgende

try 
{ 
    // Creates all directories in the path if they do not exist 
    boost::filesystem::create_directories("!?#Gibberish!?#"); 
} 
catch(boost::filesystem::filesystem_error & e) 
{ 
    // Not very clear on how to get meaningful information from the exception 
    // The codes are found in boost::system::errc::<your code here> 
    // Try and get the value and then find the Windows codes mapped to the boost codes? 
    // The actual numeric value can be found in the header with the Windows codes - errno.h under _CRT_NO_POSIX_ERROR_CODES? 
    // 
    // You'll have to compare against specific ones and make your own meaningful error message? 
    const boost::system::error_code errorCode = e.code(); 

    std::ostringstream msg; 
    msg << "boost::filesystem::create_directories failed with error code: " << errorCode.message(); 


    // Use our own exception type 
    throw Common::Exception(__FILE__, __LINE__, msg.str()); 
} 

e.code() gibt mir einen Wert von 123 im Debugger. Wenn ich 123 in der Windows-Kopfzeile nachschlagen, zeigt es mich auf den systemeigenen Fehler von ENOPROTOOPT und den Boost-Fehler von no_protocol_option. Das kann nicht stimmen.

Die Nachricht ist etwas nützlich und sagt: "Der Dateiname, Verzeichnisname oder Volume-Label-Syntax ist falsch" Allerdings bin ich nicht sicher, sollte ich darauf verlassen, dass die Nachricht immer ausgefüllt oder sinnvoll. Es könnte viel besser für diesen Fall sein und eine Switch-Anweisung + manuelle Nachricht scheint angemessen.

Was ist der richtige Weg, um sinnvolle Fehlerinformationen aus boost :: filesystem zu erhalten? Sinnvoll sind sowohl String-Nachrichten als auch Fehlercodes, die nachgeschlagen und verglichen werden können.

Edit: Ich habe auch einige ältere Forum-Themen und Artikel gefunden, die native_error() erwähnen, aber die Ausnahme in Version 1.62, in meinem Debugger, scheint keine solche Methode ausgesetzt zu haben.

Relevante Links gefunden: http://www.boost.org/doc/libs/1_62_0/libs/filesystem/doc/reference.html#Error-reporting

catching exception from boost::filesystem::is_directory

+0

Mögliche Duplikate von [Boost Fehlercodes lesbare Beschreibung] (http://stackoverflow.com/questions/10755084/boost-error-codes-human-readable-description) – Arunmu

Antwort

1

Winerror.h sagt dies:

// 
// MessageId: ERROR_INVALID_NAME 
// 
// MessageText: 
// 
// The filename, directory name, or volume label syntax is incorrect. 
// 
#define ERROR_INVALID_NAME    123L // dderror 

Verwenden errorCode.message(); als quotet, und Sie immer den Menschen lesbare Fehlerbeschreibung.

+0

Hmm, so dass wir denken, dass sie alle korrelieren https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx und immer eine Zeichenfolge haben? Ich möchte immer noch meine eigenen Nachrichten erstellen und Werte in einem Schalter oder etwas vergleichen. Selbst der eine im Beispiel ist nicht der beste. Das wird funktionieren, wenn das der Fall ist. Ich werde ein paar Tests machen. Vielen Dank. –

+0

99,9% der Systemfehlercodes haben korrelierte Zeichenfolgenwerte. Außerdem - auf der übersetzten Windows-Schnittstelle hat es Nachricht übersetzt. – Alexander

Verwandte Themen