いくつかの答えを要約すると
デフォルトでは、ストリームは例外をスローしません。有効になっている場合は可能です。
stringstream out;
out.exceptions(std::ios::failbit); // throw exception if failbit gets set
Apache C++ 標準ライブラリ ユーザーズ ガイドによると
フラグ std::ios_base::badbit は、基になるストリーム バッファーに問題があることを示します。これらの問題は次の可能性があります。
メモリ不足。バッファの作成に使用できるメモリがないか、バッファのサイズが他の理由 (ストリームの外部から提供されたなど) で 0 であるか、std::ios_base:: のように、ストリームが独自の内部データにメモリを割り当てることができません。 iword() および std::ios_base::pword()。
基になるストリーム バッファーが例外をスローします。ストリーム バッファは、メモリ不足、コード変換の失敗、または外部デバイスからの回復不能な読み取りエラーなどにより、完全性を失う可能性があります。ストリーム バッファは、例外をスローすることによってこの整合性の喪失を示すことができます。例外はストリームによってキャッチされ、ストリームの状態に badbit が設定されます。
通常、badbit は回復不可能なエラー状況を示し、failbit は失敗した操作を再試行できる可能性がある状況を示すことに注意してください。
したがって、これを行う最も安全な方法は
string do_something(int in)
{
stringstream out; // This could throw a bad_alloc
out << std::fixed << in; // This could set bad or fail bits
if(out.good())
{
return out.str();
}
else
{
return "";
}
}
ただし、ストリームの作成が失敗した場合のbad_alloc の処理によると、心配すべきより大きな問題があり、プログラムはおそらく終了するため、これはやり過ぎです。したがって、ストリームの作成を過ぎたと仮定すると、badbit が設定される可能性は非常に低いです。(ストリームはメモリ < sizeof(int) で割り当てられます)。
また、failbit が設定される可能性はほとんどありません (破損したスタック以外のスタックから読み取るユースケースについては不明です)。したがって、この時点でストリーム エラーから回復する可能性は低いため、次のコードで十分です。
string do_something(int in)
{
stringstream out;
out << std::fixed << in;
return out.str();
}