Boost :: file_system: проверка кодов ошибок

Хотя я использую C ++ 11, этот вопрос связан с бустом, так как я обрабатываю ошибки из 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(),

Мои вопросы: могут ли разные условия ошибки из разных категорий ошибок иметь одинаковые значения? Я имею в виду, нужно ли мне проверять и категории ошибок, и значения ошибок, чтобы убедиться, что я получаю конкретную ошибку? В таком случае, какой самый чистый способ сделать это?

4

Решение

error_codes а также error_conditions с разными error_categories разрешено иметь то же самое value(), не принадлежащие функции сравнения проверьте значение и категорию:

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

Возвращает: lhs.category() == rhs.category() && lhs.value() == rhs.value(),

Следовательно, исключения error_code может быть проверен против возврата из make_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_codes, которые не эквивалентны, несмотря на то, что имеют одинаковое значение:

#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
8

Другие решения


По вопросам рекламы [email protected]