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

ストリームはデフォルトでは例外をスローしませんが、関数呼び出しで例外をスローするように指示できます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 に答える