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)ec
是 false
?
例如,假设我有以下内容:
std::error_code ec;
std::filesystem::path fpath = "fname";
bool does_exist = std::filesystem::exists(fpath, ec);
if (does_exist) {
...
}
是否有必要检查 (bool)ec == false
在 if (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
假设路径存在是安全的.
错误代码更轻量级,特别适合实时高性能代码、数值模拟和高性能应用程序。在这些情况下,人们可能会完全关闭编译过程的异常处理,只是为了获得更好的性能。另一方面,对于嵌套代码,错误代码通常更难维护——如果例程在某些子函数中失败——你将不得不通过几层将错误代码传递到应该处理错误的地方。这方面的异常更容易维护。
std::filesystem::exists 用于检查“给定的文件状态或路径是否对应于现有文件或目录”。在我的代码中,我使用具有以下签名的定义:
bool exists( const std::filesystem::path& p, std::error_code& ec ) noexcept;
我的问题是:如果函数returns布尔值true
,我还需要检查错误代码ec
的值吗?或者我可以假设,如果 std::filesystem::exists
returns true
,那么没有错误并且 (bool)ec
是 false
?
例如,假设我有以下内容:
std::error_code ec;
std::filesystem::path fpath = "fname";
bool does_exist = std::filesystem::exists(fpath, ec);
if (does_exist) {
...
}
是否有必要检查 (bool)ec == false
在 if (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 executesec.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
假设路径存在是安全的.
错误代码更轻量级,特别适合实时高性能代码、数值模拟和高性能应用程序。在这些情况下,人们可能会完全关闭编译过程的异常处理,只是为了获得更好的性能。另一方面,对于嵌套代码,错误代码通常更难维护——如果例程在某些子函数中失败——你将不得不通过几层将错误代码传递到应该处理错误的地方。这方面的异常更容易维护。