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

Has*_*yed 14 c++ portability defensive-programming stl exception

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

我将"basic :: ios_clear"作为一个错误消息从一个 已启用异常what的downcasted catch(std::exception)方法中获取fstream.这对我来说意义不大,虽然我知道问题是什么,但我希望我的程序能够提供更多信息,这样当我几个月后开始部署时,我的生活会更容易.

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

vla*_*adr 7

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

更新 - 关于可移植性

顺便提一下,IIRC Visual Studio的fstream实现调用了_open/ _read/ _write/ etc.CRT方法,设定errno. 在CRT方法返回后,Microsoft不保证GetLastError仍包含正确的值.同意cygwin,mingw等实现,其中errno没有任何声明或保证GetLastError.

所以我坚持我的主张,你所需要的,可以,因此想做的就是检查errno.

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