尝试I / O我得到一个异常,不应该抛出任何异常:
#include <iostream>
#include <fstream>
int main()
{
std::ifstream f("/tmp");
std::cout << "Exception Flags: " << f.exceptions() << std::endl;
if(f >> std::ws) std::cout << "This will not succeed" << std::endl;
else std::cout << "Ok - it fails" << std::endl;
return 0;
}
但输出是:
Exception Flags: 0
terminate called after throwing an instance of 'std::ios_base::failure'
what(): basic_filebuf::underflow error reading the file
Aborted
g ++(Ubuntu / Linaro 4.7.2-2ubuntu1)4.7.2
修改
测试应该毫无例外地失败:
从27.5.5.4 basic_ios标志函数
void clear(iostate state = goodbit);
4后置条件:如果rdbuf()!= 0则state == rdstate();否则rdstate()==(state | ios_base :: badbit)。
5效果:if((state |(rdbuf()?goodbit:badbit))&amp; exceptions())== 0,返回。否则,该函数抛出一个 对象失败的类basic_ios :: failure(27.5.3.1.1),由。构造 实现定义的参数值。
void setstate(iostate state);
6效果:呼叫清除(rdstate()| state)(可能会抛出basic_ios :: failure(27.5.3.1.1))。
答案 0 :(得分:7)
这是一个错误,并使用libc ++ doesn't exhibit this behaviour来铿锵v3.4; GCC 4.8的libstdc ++ still does。
从libstdc ++源代码和异常文本中,我会说basic_ios::clear
没有捕获从调用堆栈中抛出的异常并应用“正在播放的异常标志?”在重新抛出它们之前的逻辑。
去年已经提出bug 53984。