C++ 从fstream';获取有意义的错误消息;s在C++;

C++ 从fstream';获取有意义的错误消息;s在C++;,c++,exception,stl,portability,defensive-programming,C++,Exception,Stl,Portability,Defensive Programming,从std::fstreams以可移植的方式获取有意义的文件访问错误消息的最佳方法是什么?badbits和failbits的原始性变得有点烦人。我以前已经针对win32和POSIX编写了自己的异常层次结构,这比STL的方式灵活得多 我从启用了异常的fstream的降级捕获(std::exception)的what方法中得到了一条错误消息“basic::ios\u clear”。这对我来说意义不大,虽然我知道问题是什么,但我希望我的程序能提供更多的信息,这样几个月后我开始部署时,我的生活会更轻松 B

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

我从启用了异常的
fstream
的降级捕获(
std::exception
)的
what
方法中得到了一条错误消息“basic::ios\u clear”。这对我来说意义不大,虽然我知道问题是什么,但我希望我的程序能提供更多的信息,这样几个月后我开始部署时,我的生活会更轻松


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

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

更新——关于可移植性 顺便提一下,IIRC Visual Studio的
fstream
实现调用
\u open
/
\u read
/
\u write
/etc.CRT方法,这些方法设置
errno
Microsoft不保证在CRT方法返回后
GetLastError
仍然包含正确的值。Idem用于cygwin、mingw等实现,该实现设置了
errno
,没有关于
GetLastError
的声明或保证

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


现在,考虑到以上所有因素,如果你仍然想通过使用
Boost::System
而不是简单地调用
strerror
来让你的生活复杂化和过度工程化,那么我想我和你对优雅和简单的定义是不一样的

您想要什么信息<代码>无效位表示I/O错误<代码>eofbit表示eof<代码>故障位表示分析错误


无论如何,为了消除一种解决方案,我认为您不能因为ADL而重写本机类型输入函数。您可以实现
operator>>(istream,input\u safe\u int)
,其中
input\u safe\u int
int&
构造而成。在里面放一个
试一下
块,等等。

仅仅因为“没有人阻止我”并不意味着你的建议接近elegent。此外,我还说过“以前我已经针对win32和POSIX编写了自己的异常层次结构”,最后我还提到了可移植性是一个理想的特性。所以这个答案没有任何价值。谢谢。@Hassan Syed:boost中唯一接近这一点的是
boost::System
(),这对iostreams没有帮助。我不想听起来很挑剔,但尽管“重新编写”操作系统抽象的统一错误处理确实是标准,但这正是我的问题要解决的问题。对显而易见的问题进行重新分类——这也在问题中得到了解决——并不是一个解决办法。我不想重新发明轮子,我在问是否有一个现代的robus解决方案来解决我的问题。谢谢你billy(+1),我知道它的存在,我想我会给图书馆仔细看看。billy仔细检查后,boost::system确实是我问题的精确解决方案。如果您创建了答案,我可以接受它:D。我之所以避免它,是因为它没有教程样式的文档:D+1作为问题的答案-我也有这个问题。拥有这样一个不能提供有意义的错误消息的基本接口似乎很可笑。至少APR(ApachePortableRuntime)提供了这一点。能够用文件名(如“无效权限”或“磁盘错误”)向用户传达操作系统的问题非常重要。否则,程序会正确地停止运行,但用户不知道要采取什么措施来纠正问题。