在主要中捕获ifstream异常

时间:2016-02-29 18:10:12

标签: c++ exception exception-handling fstream

我试图捕获从main中读取类方法中的文件时出现错误时抛出的异常。简化的代码是:

#include <iostream>
#include <fstream>
#include <string>

class A
{
public:
    A(const std::string filename)
    {
       std::ifstream file;
       file.exceptions( std::ifstream::failbit | std::ifstream::badbit);
       file.open(filename);
    }

};

int main()
{
    std::string filename("file.txt");
    try
    {
        A MyClass(filename);
    }
    catch (std::ifstream::failure e)
    {
        std::cerr << "Error reading file" << std::endl;
    }

}

我用以下代码编译此代码:

 $ g++ -std=c++11 main.cpp

如果file.txt不存在任何事情,但是当它没有时,程序终止时出现以下错误:

terminate called after throwing an instance of 'std::ios_base::failure'
    what(): basic_ios::clear
zsh: abort (core dumped) ./a.out

但我希望代码能够捕获异常并显示错误消息。为什么没有抓住异常?

1 个答案:

答案 0 :(得分:3)

您可以通过在命令行中添加-D_GLIBCXX_USE_CXX11_ABI=0来使其在GCC中工作。 Here是GCC的一个实例。

从下面的评论(特别是LogicStuff&#39;测试)和我自己的测试看来,在clang和MSVC中它似乎不会产生这个错误。

感谢上面的LogicStuff评论,我们现在知道这是GCC bug。因为在GCC C ++ 03中,ios :: failure并不是从runtime_error派生的,所以没有被捕获。

另一种选择可能是改为:

try
{
    A MyClass(filename);
}
catch (std::ifstream::failure e)
{
    std::cerr << "Error reading file\n";
}
catch (...)
{
    std::cerr << "Some other error\n";
}