在C ++中从fstream获取有意义的错误消息

时间:2010-04-14 16:52:06

标签: c++ exception stl portability defensive-programming

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

我将“basic :: ios_clear”作为what方法的std::exception方法的错误消息,该方法是fstream已启用例外的fstream。这对我来说意义不大,虽然我知道问题是什么,但我希望我的程序能够提供更多信息,这样当我几个月后开始部署时,我的生活会更容易。

Boost中有什么东西可以从{{1}}的实现跨平台中提取有意义的消息并跨越STL实现吗?

2 个答案:

答案 0 :(得分:7)

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

更新 - 关于可移植性

顺便提一下,IIRC Visual Studio的fstream实现会调用_open / _read / _write /等。 CRT方法,设置errno 在CRT方法返回后,Microsoft不保证GetLastError仍然包含正确的值。同意cygwin,mingw等实现,它们errno没有关于GetLastError的声明或保证。

因此,我支持我的声称,您只需要检查errno即可。

}。

现在,考虑到上述所有情况,如果你仍然希望使用Boost::System而不是简单地调用strerror来使你的生活和过度工程师复杂化,那么我想我的定义以及你对优雅和简洁的定义是不一样。 :)

答案 1 :(得分:0)

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

为了消除一个解决方案,无论如何,我认为你不能因为ADL而覆盖本机类型的输入函数。您可以实施operator>>(istream, input_safe_int) input_safe_intint&构建try。放入{{1}}块等等