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

标签 c++ exception stl portability defensive-programming

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

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

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

最佳答案

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

更新——关于可移植性

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

所以我支持我的声称您需要、可以并且因此想要做的就是检查errno

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

关于c++ - 从 C++ 中的 fstream 获取有意义的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2639324/

相关文章:

c++ - 为什么要声明一个 double 组来存储一个整数(C++)

exception - GitHub API : create pull-request that already exists should not throw exception

Xcode 4.5 损坏 XIB?

c++ - 使用 std::for_each 遍历树

c++ - std::map: find(key)->second 比 [] 运算符快吗?

c++ - 我可以在初始化列表中用 10 个相同的整数初始化 STL vector 吗?

C++子类访问修饰符?

c++ - 输入命令的控制台

c++ - 如何传递带有虚方法的类以及如何将其用作成员变量?

delphi - Delphi:退出Delphi 6后的AV