std::filesystem::exists -- 如果函数 returns 为真,我是否需要检查 std::error_code 值?

std::filesystem::exists -- Do I need to check the std::error_code value if the function returns true?

std::filesystem::exists 用于检查“给定的文件状态或路径是否对应于现有文件或目录”。在我的代码中,我使用具有以下签名的定义:

bool exists( const std::filesystem::path& p, std::error_code& ec ) noexcept;

我的问题是:如果函数returns布尔值true,我还需要检查错误代码ec的值吗?或者我可以假设,如果 std::filesystem::exists returns true,那么没有错误并且 (bool)ecfalse?

例如,假设我有以下内容:

std::error_code ec;
std::filesystem::path fpath = "fname";
bool does_exist = std::filesystem::exists(fpath, ec);
if (does_exist) {
    ...
}

是否有必要检查 (bool)ec == falseif (does_exist) { ... } 块内?

来自 cppreference:

The overload taking a std::error_code& parameter sets it to the OS API error code if an OS API call fails, and executes ec.clear() if no errors occur.

不,您不需要。最好只在调用失败时使用它。任何其他时间 ec 都不会包含任何有用的信息。

您可以使用 if-initializer 语句强制执行此操作,以便仅在可能的最小范围内声明错误代码:

std::filesystem::path fpath{"fname"};
if(std::error_code ec{}; !std::filesystem::exists(fpath, ec)) {
    std::cerr << "File system returned the following for \"" << fpath.string() << "\":\nError: " << ec.value() << "\nMessage: " << ec.message();
}

使用不同类型的错误处理std::filesystem library evolved out directly from the corresponding Boost library. As several functions in the Boost libraries (such as Boost ASIO) it offers two interfaces

bool exists(std::filesystem::path const& p);
bool exists(std::filesystem::path const& p, std::error_code& ec) noexcept;

第一个版本使用 exceptions(必须用 try... catch 构造捕获)而第二个版本不使用,而是必须评估错误代码.此 错误代码 可能包含 有关失败的确切原因的其他信息 并在函数 returns [=13] 时帮助调试=].

The overload that does not take a std::error_code& parameter throws filesystem_error on underlying OS API errors, constructed with p as the first path argument and the OS error code as the error code argument. The overload taking a std::error_code& parameter sets it to the OS API error code if an OS API call fails, and executes ec.clear() if no errors occur. Any overload not marked noexcept may throw std::bad_alloc if memory allocation fails.

另一方面,如果函数 returns true 假设路径存在是安全的.

错误代码更轻量级,特别适合实时高性能代码、数值模拟和高性能应用程序。在这些情况下,人们可能会完全关闭编译过程的异常处理,只是为了获得更好的性能。另一方面,对于嵌套代码,错误代码通常更难维护——如果例程在某些子函数中失败——你将不得不通过几层将错误代码传递到应该处理错误的地方。这方面的异常更容易维护。