2016-11-09 24 views
1

私は、Windowsを呼び出すことからboost :: filesystemを使用するように切り替えることを検討しています。しかし、実際には、意味のあるエラー情報をどのように取得するかについては、何も書かれていません。簡単な例についてはboost :: filesystem :: filesystem_errorからエラーコードの意味を取得する方法

、私は)(以下

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をした私のデバッガで123の値を与えます。 Windowsヘッダーで123を参照すると、ENOPROTOOPTのネイティブエラーとno_protocol_optionのブーストエラーが表示されます。それは正しいことではありません。

メッセージがしかし、私は常に記入されているメッセージに頼るか、感覚を作るべきであることを確認していない、やや有用であり、「ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません」と言います。このケースではもっとうまくいくかもしれませんし、switch文+手動メッセージが適切だと思われます。

ブースト::ファイルシステムのうち、意味のあるエラー情報を取得するための適切な方法は何ですか?意味があるのは、文字列メッセージと、ルックアップと比較可能なエラーコードの両方です。

編集: native_error()という古いフォーラムスレッドと記事がありますが、デバッガのバージョン1.62の例外ではこのようなメソッドが公開されていないようです。私が見つけた

関連リンク:quotetとして

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

使用errorCode.message();、あなたは常に人間が読めるエラーの説明を取得します: http://www.boost.org/doc/libs/1_62_0/libs/filesystem/doc/reference.html#Error-reporting

catching exception from boost::filesystem::is_directory

+0

[ブーストエラーコード人間が判読可能な説明](0120-338-501)を参照してください。 – Arunmu

答えて

1

WINERROR.Hはこれを言います。

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx常に文字列がありますか?私はまだ自分のメッセージを作り、スイッチや何かの値を比較したいと思っています。例のものでさえ最高ではありません。そうであれば、それはうまくいくでしょう。私はいくつかのテストをします。ありがとう。 –

+0

システムエラーコードの99.9%には相関する文字列値があります。さらに、翻訳されたウィンドウのインターフェースにはメッセージが翻訳されています。 – Alexander

関連する問題