std :: ifstream中的意外异常

时间:2013-12-04 09:48:38

标签: c++ iostream

尝试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))。

1 个答案:

答案 0 :(得分:7)

这是一个错误,并使用libc ++ doesn't exhibit this behaviour来铿锵v3.4; GCC 4.8的libstdc ++ still does

从libstdc ++源代码和异常文本中,我会说basic_ios::clear没有捕获从调用堆栈中抛出的异常并应用“正在播放的异常标志?”在重新抛出它们之前的逻辑。

去年已经提出bug 53984