Boost::file_system:检查错误码



虽然我使用的是c++ 11,但这个问题与boost有关,因为我正在处理来自boost::file_system的错误。

在下列情况下:

try {
     // If p2 doesn't exists, canonical throws an exception
     // of No_such_file_or_directory
     path p = canonical(p2);
     // Other code
} catch (filesystem_error& e) {
    if (e is the no_such_file_or_directory exception)
        custom_message(e);
} // other catchs
}

如果在抛出所需的异常(no_such_file_or_directory)时打印错误值:

// ...
} catch (filesystem_error& e) {
     cout << "Value: " << e.code().value() << endl;
}

我得到值2。与"e.code().default_error_condition().value()"相同。

我的问题是:不同错误类别的不同错误条件是否具有相同的值?我的意思是,我是否需要检查,错误类别和错误值,以确保我得到一个特定的错误?在这种情况下,最干净的方法是什么?

允许不同error_categorieserror_codeserror_conditions具有相同的value()。非成员比较函数检查值和类别:

bool operator==( const error_code & lhs, const error_code & rhs ) noexcept;

返回: lhs.category() == rhs.category() && lhs.value() == rhs.value() .

因此,可以根据make_error_code()的返回值检查异常的error_code,如下所示:
try {
  // If p2 doesn't exists, canonical throws an exception
  // of No_such_file_or_directory
  path p = canonical(p2);
  // ...    
} catch (filesystem_error& e) {
  if (e.code() ==
      make_error_code(boost::system::errc::no_such_file_or_directory)) {
    custom_message(e);    
  }
}

下面是一个完整的示例,演示了两个不相等的error_code s,尽管它们具有相同的值:

#include <boost/asio/error.hpp>
#include <boost/filesystem.hpp>
#include <boost/system/error_code.hpp>
int main()
{
  // Two different error codes.
  boost::system::error_code code1 = make_error_code(
    boost::system::errc::no_such_file_or_directory);
  boost::system::error_code code2 = make_error_code(
    boost::asio::error::host_not_found_try_again);
  // That have different error categories.
  assert(code1.category() != code2.category());
  assert(code1.default_error_condition().category() !=
         code2.default_error_condition().category());
  // Yet have the same value.
  assert(code1.value() == code2.value());
  assert(code1.default_error_condition().value() ==
         code2.default_error_condition().value());
  // Use the comparision operation to check both value
  // and category.
  assert(code1 != code2);
  assert(code1.default_error_condition() !=
         code2.default_error_condition());
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  // Test with Boost.Filesytem
  try
  {
    boost::filesystem::canonical("bogus_file");
  }
  catch(boost::filesystem::filesystem_error& error)
  {
    if (error.code() == 
        make_error_code(boost::system::errc::no_such_file_or_directory))
    {
      std::cout << "No file or directory" << std::endl;
    }
    if (error.code() ==
        make_error_code(boost::asio::error::host_not_found_try_again))
    {
      std::cout << "Host not found" << std::endl;
    }
  }
}

生成以下输出:

No file or directory

相关内容

  • 没有找到相关文章

最新更新