流异常处理

时间:2012-04-26 16:53:49

标签: c++ exception exception-handling ofstream

故意我有这个写入文件的方法,所以我试图处理我写入封闭文件的可能性的例外:

void printMe(ofstream& file)
{
        try
        {
            file << "\t"+m_Type+"\t"+m_Id";"+"\n";
        }
        catch (std::exception &e)
        {
            cout << "exception !! " << endl ;
        }
};

但显然std :: exception不是关闭文件错误的合适例外,因为我故意尝试在已经关闭的文件上使用此方法,但我的“exception !!”注释没有生成。

那么我应该写什么例外?

3 个答案:

答案 0 :(得分:13)

默认情况下,Streams不会抛出异常,但您可以告诉他们使用函数调用file.exceptions(~goodbit)抛出异常。

相反,检测错误的常规方法只是检查流的状态:

if (!file)
    cout << "error!! " << endl ;

这样做的原因是,有许多常见情况,无效读取是次要问题,而不是主要问题:

while(std::cin >> input) {
    std::cout << input << '\n';
} //read until there's no more input, or an invalid input is found
// when the read fails, that's usually not an error, we simply continue

与之相比:

for(;;) {
    try {
        std::cin >> input;
        std::cout << input << '\n';
    } catch(...) {
        break;
    }
}

现场直播:http://ideone.com/uWgfwj

答案 1 :(得分:4)

ios_base::failure 类型的例外情况,但请注意,您应该使用 ios::exceptions 设置相应的标记以生成例外或仅将设置内部状态标志以指示错误,这是流的默认行为。

答案 2 :(得分:0)

请考虑以下内容:

void printMe(ofstream& file)
{
        file.exceptions(std::ofstream::badbit | std::ofstream::failbit);
        try
        {
            file << "\t"+m_Type+"\t"+m_Id";"+"\n";
        }
        catch (std::ofstream::failure &e) 
        {
            std::cerr << e.what() << std::endl;
        }
};