从std :: fstreams以便携方式获取有意义的文件访问错误消息的最佳方法是什么? badbits
和failbits
的原始性变得有点烦人。我之前已经针对win32和POSIX编写了自己的异常层次结构,这比STL的方式更灵活。
我将“basic :: ios_clear”作为what
方法的std::exception
方法的错误消息,该方法是fstream
已启用例外的fstream
。这对我来说意义不大,虽然我知道问题是什么,但我希望我的程序能够提供更多信息,这样当我几个月后开始部署时,我的生活会更容易。
Boost中有什么东西可以从{{1}}的实现跨平台中提取有意义的消息并跨越STL实现吗?
答案 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_int
从int&
构建try
。放入{{1}}块等等