vendredi 24 novembre 2023

Handling of error in streambuf::underflow?

I am trying to make sense of the code posted by @dietmar-kühl at:

I do not understand how I am supposed to handle error from within underflow. I have checked the documentation without much luck:

Here is a pseudo code:

class customstreambuf : public std::streambuf
{
    socketstream* stream_;

public:
    explicit customstreambuf(socketstream* stream) : stream_(stream)
    {
    }

    int underflow() override
    {
        if (this->gptr() == this->egptr())
        {
            // fills internal buffer, return num bytes read or -1 on error:
            const int size = this->stream_->fillbuffer();
            if (size < 0)
            {
                throw std::runtime_error("what should I do here?");
            }
            this->setg(this->stream_->buffer_, this->stream_->buffer_, this->stream_->buffer_ + size);
        }
        return this->gptr() == this->egptr()
                   ? std::char_traits<char>::eof()
                   : std::char_traits<char>::to_int_type(*this->gptr());
    }
};

Other posts are relatively evasive for error conditions:

How should I handle error in std::streambuf subclass ? throw an exception (which type) or do something else ?


Just discovered the following awkward post:

which seems kind of mixed java/c++ code (what's IOException ?)


I also found the following:

Which also gives a relative elusive Throwing an exception is indeed the way to go.. Would it make sense to throw something like:

if (size < 0)
{
    throw "socket stream error";
}

Aucun commentaire:

Enregistrer un commentaire