繁体   English   中英

在今天的 C++ 中,我可以在构造 fstream 时可靠地得到错误吗?

[英]In today's C++, can I reliably get errors when constructing an fstream?

我想使用 C++ 标准库设施( std::ifstream )从文件中读取 - 当然,如果遇到错误,可靠地报告错误。

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

  • std::basic_fstreamstd::ifstream是其实例化的模板)默认情况下不抛出异常。
  • 您可以进行基本的 fstream 抛出异常 - 但仅在构造之后,因此构造不会失败。 请参阅basic_ios::exceptions() (这是std::ifstream的超类)。

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

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

答案告诉我们:

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

这很糟糕。 另一方面,14年过去了。 有什么改变吗? 也就是说,对于抛出的异常或设置的errno / GetLastError()是否有更好的保证? 如果不是,那么在构造std::fstream时报告错误的“尽力而为”的方法是什么?

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

这是我现在能想到的最好的事情——“遮住我的屁股”,以防errno不知何故未设置。 在最坏的情况下,我正在浪费一些周期重新投入“不愉快的道路”。

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) {
    throw (errno == 0) ? exception :
        std::system_error{ errno, std::generic_category(),
        "opening file " + file_path.native());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM