14

从 std::fstreams 以可移植方式获取有意义的文件访问错误消息的最佳方法是什么?badbits和的原始性failbits变得有点烦人。我之前已经针对 win32 和 POSIX 编写了自己的异常层次结构,这比 STL 的方式灵活得多。

我从启用了异常what的 a 的向下转换的 catch ( std::exception)方法中收到“basic::ios_clear”作为错误消息fstream 。这对我来说意义不大,尽管我确实知道问题出在哪里,但我希望我的程序能提供更多信息,这样当我几个月后开始部署时,我的生活会更轻松。

Boost 中是否有任何东西可以从fstream跨平台和跨 STL 实现中提取有意义的消息?

4

3 回答 3

7

没有人会阻止您检查errno/ strerror(例如在您的异常处理程序中)以查找更具体的失败原因。

更新——关于可移植性

顺便说一句,IIRC Visual Studio 的fstream实现调用了_open///等。CRT 方法,其中设置. Microsoft 不保证CRT 方法返回后仍然包含正确的值。cygwin、mingw 等实现的同上,它设置没有关于._read_writeerrnoGetLastErrorerrnoGetLastError

因此,我坚持我的主张,即您需要、可以并且因此想要做的就是检查errno

现在,鉴于以上所有情况,如果您仍然想通过使用Boost::System而不是简单地调用来使您的生活复杂化和过度设计,strerror那么我想我的定义和您对优雅和简单的定义是不一样的。:)

于 2010-04-14T19:08:31.837 回答
0

你想要什么信息?badbit指示 I/O 错误。eofbit表示 eof。failbit表示解析错误。

无论如何,为了消除一种解决方案,我认为您不能因为 ADL 而覆盖本机类型的输入函数。您可以实现operator>>(istream, input_safe_int)whereinput_safe_int是从int&. 在里面放一个try块,等等。

于 2010-04-15T13:19:36.603 回答
0

我很幸运抓住了std::ios_base::failure然后重新提高std::system_errorusing errno

terminate called after throwing an instance of 'std::system_error'
  what():  broken/path: No such file or directory
#include <fstream>

int main() {
  const std::string filename{ "broken/path" };
  try {
    std::ifstream file{ filename };
    file.exceptions(std::ios::failbit); // std::ios_base_failure is thrown here
  } catch (std::ios_base::failure&) {
    throw std::system_error{ errno, std::generic_category(), filename };
  }
}

这适用于 UNIX 和 Windows,因为“所有errno值都是…… UNIX-compatible”(来源)。

于 2021-11-05T19:12:32.477 回答