如何从boost :: filesystem :: filesystem_error中获取错误代码的含义

时间:2016-11-09 04:46:31

标签: c++ boost error-handling

我正在考虑从调用Windows切换到使用boost :: filesystem。但是,文档实际上告诉我几乎没有关于如何从中获取有意义的错误信息。

举一个简单的例子,我做了以下

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的提升错误。这可能是对的。

该消息有点用,并说&#34;文件名,目录名或卷标语法不正确&#34;但是,我不确定我是否应该依赖于总是填写或有意义的信息。对于这种情况可能会更好,并且切换语句+手动消息似乎是合适的。

从boost :: filesystem中获取有意义的错误信息的正确方法是什么?有意义的是字符串消息和错误代码,可以查找和比较。

编辑: 我还发现了一些较旧的论坛帖子和文章提到了native_error(),但是,在我的调试器中,版本1.62中的例外似乎没有暴露任何此类方法。

相关链接我发现: http://www.boost.org/doc/libs/1_62_0/libs/filesystem/doc/reference.html#Error-reporting

catching exception from boost::filesystem::is_directory

1 个答案:

答案 0 :(得分:1)

WinError.h说:

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

使用errorCode.message();作为quotet,并且您始终可以获得人类可读的错误说明。