13

故意我有这个写入文件的方法,所以我试图处理我正在写入关闭文件的可能性的异常:

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

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

那么我应该写什么例外?

4

3 回答 3

18

Streams 默认不抛出异常,但你可以通过函数 call 告诉它们抛出异常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

于 2012-04-26T16:58:16.270 回答
5

ios_base::failure类型的异常,但是请注意,您应该使用ios::exceptions设置适当的标志来生成异常,否则只会设置内部状态标志来指示错误,这是流的默认行为。

于 2012-04-26T16:58:39.043 回答
2

考虑以下:

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;
        }
};
于 2020-10-21T08:27:29.990 回答