我想使用C++标准库工具(std::ifstream
(读取文件,当然,如果遇到错误,也会可靠地报告错误。
显然,这不是一件容易的事!
默认情况下,std::basic_fstream
(std::ifstream
是其实例化的模板(不会抛出异常- 你可以让一个基本的fstream抛出异常,但只有在构造之后,这样构造就不会失败。参见
basic_ios::exceptions()
(它是std::ifstream
的一个超类(
14年前,有人问过这个问题:
获取std::fstream失败错误消息和/或异常
答案告诉我们:
- 不能保证抛出的异常会告诉我们错误的原因(只是发生了一些错误(
- 我们不能保证当在流上设置故障位或坏位时,
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());
}