2017-07-19 3 views
1

ファイルクローズ操作が失敗した場合など、ファイルストリームデストラクタが例外をスローすることはできますか?ファイルストリームデストラクタがC++で例外をスローすることはできますか?

auto f = new std::ofstream("data.txt"); 
    f->exceptions(std::ofstream::failbit | std::ofstream::badbit); 
    ... 
    delete f; // May throw?  

ストリームを手動で閉じると、このような例外を防止できますか?

auto f = new std::ofstream("data.txt"); 
    f->exceptions(std::ofstream::failbit | std::ofstream::badbit); 
    ... 
    f->close(); 
    delete f; // May throw?  
+1

https://stackoverflow.com/q/748014/72178を参照してください。 – ks1322

+4

デストラクタからの標準的なクラスのスローはありません。どちらもあなたのものではありません。 – molbdnilo

答えて

2

デストラクタからの投棄は危険であり、避けるべきです。 C++標準ライブラリのオブジェクトはデストラクタからスローされません。 C++言語は暗黙のうちに、デストラクタがnoexceptと宣言されていると仮定しています。

std::basic_filebuf<>::~std::basic_filebuf()の唯一の違いは、実際のところです。後者はclose()を呼び出しますが、再スローすることなく例外をキャッチします。したがって、基礎となるファイルを閉じる際に問題をキャッチしたい場合は、ofstream::rdbuf()->close()を明示的に呼び出すことができます。しかし、ofstream::close()は効果的にrdbuf()->close()を呼び出し、例外を捕捉します。この場合、failbitが設定されています。に応じてストリームの例外マスクが設定されています(ofstream::exceptions()を使用します)。std::ios_base::failureの例外をスローします。あなたがファイルを閉じるにはRAII(すなわちデストラクタ)を使用する場合

  • を、何の 例外が 基礎となるファイルを閉じることができませんでした場合でも、デストラクタの外に伝播されません。したがって、要約する

    きれいに。この場合、フェイルビット が設定されます。

  • std::ofstreamを明示的にclose()と指定すると、ファイルのクローズに問題が発生したときに、ストリームの例外マスクに応じてstd::ios_base::failureがスローされることがあります。
+0

@Holtありがとう。私はあなたのコメントを反映するために私の答えを編集しました。 – Walter

関連する問題