在当今C++,在构建流时能否可靠地出现错误?



我想使用C++标准库工具(std::ifstream(读取文件,当然,如果遇到错误,也会可靠地报告错误。

显然,这不是一件容易的事!

默认情况下,
  • std::basic_fstream(std::ifstream是其实例化的模板(不会抛出异常
  • 你可以让一个基本的fstream抛出异常,但只有在构造之后,这样构造就不会失败。参见basic_ios::exceptions()(它是std::ifstream的一个超类(

14年前,有人问过这个问题:

获取std::fstream失败错误消息和/或异常

答案告诉我们:

  1. 不能保证抛出的异常会告诉我们错误的原因(只是发生了一些错误(
  2. 我们不能保证当在流上设置故障位或坏位时,errno/GetLastError()会为我们提供非零/非成功值

太糟糕了。另一方面,14年过去了。有什么变化吗?也就是说,对于抛出的异常或正在设置的errno/GetLastError(),是否有更好的保证?如果不是;尽最大努力";报告CCD_ 10结构错误的方法?

(我很想问"为什么构造函数不抛出***失败,但我们不要谈论这个。">

这是我现在能想到的最好的事情-"盖住我的屁股";以防以某种方式未设置CCD_ 11。最坏的情况是,我在浪费一些周期,重新投入";不幸的道路";。

// TODO: Consider checking errno here
std::filesystem::path file_path = whatever();
std::ifstream file(file_path, std::ios::binary | std::ios::ate);
try {
file.exceptions(std::ios::failbit | std::ios::badbit);
} catch (std::ios_base::failure& exception) {
if (errno == 0) {
throw;
}
throw std::system_error{ errno, std::generic_category(),
"opening file " + file_path.native());
}

相关内容

  • 没有找到相关文章

最新更新