iostreamの例外を制御するには exceptions(iostate except) を呼び出せば よいようである。 iostate は
がある。これに加え
が定義されている。 bad()とfail()の違いは微妙とされている。それまでのstreamは壊れて いないが動作できなくなったのがfail()で、streamそのものが壊れて いる場合はbad()であるとされている。例えば eof を超えて読み出そう とした場合は fail() だし、読み出し長さ(gcount())が 0 の場合も fail() で扱われている。 tcp connection で考えてみよう。
例えば connect()に失敗した時は、::gethostbyname() で address 解決 できているとすると、一番考えられるのは相手ポートが開いてないか、 接続拒否だろうが、この場合相手が存在しているので、bad() ではなく fail() と考えるべきかも知れない。 file を stream化した fstream では open できなかった場合は、 fail() で扱われてるので、その意味では ::connect() の失敗は fail() が妥当かも知れない。 |