Boost logo

Boost :

From: Christopher Kohlhoff (chris_at_[hidden])
Date: 2006-06-27 09:12:18


Hi Peter,

Peter Dimov <pdimov_at_[hidden]> wrote:
> The current intrerface gives priority to system error codes as
> evidenced by the single argument constructor. I could argue
> that we need to reverse that and give priority to errno, but
> another approach would be to just give the two equal standing
> with a from_sysno enum.

I would prefer that they are given equal weight, but as I've
said elsewhere I also believe there's a need for other error
categories.

> It isn't clear why there is no error_code::message() const.
> Probably to not introduce a dependency on std::string and to
> avoid a copy. In my opinion, if you have to convert error
> codes to strings in an inner loop where the copy might be of
> any significance, you have already lost. :-) So I'd prefer the
> user-friendlier approach of
>
> std::string error_code::message() const;
> std::wstring error_code::wmessage() const;
>
> as people generally prefer members.

IMHO the error_code class should have fewer member functions,
not more, and it should look more like a class that emulates a
builtin type. However this line of thinking is probably driven
by how I see this class being used wrt asio.

Here's another thought: since POSIX strerror is defined to
return a locale-dependent string, perhaps a C++ equivalent ought
to use std::locale?

(However, in practice this needs to be implemented on top of
available system APIs, and I don't know if it's possible to
implement std::locale-based functions in terms of setlocale().)

> The introduction of operator== is also of questionable utility
> as it also forces us to prefer one of the two codes over the
> other.

If the constructors give equal weight to error types, then this
would not be a problem.

I think operator== and != are necessary because I would like to
be able to define global error objects for the "well known"
errors that can be returned by socket operations. E.g.:

  namespace boost { namespace asio { namespace error {
    extern const error_code eof;
    extern const error_code network_reset;
    extern const error_code operation_aborted;
    ...
  }}}

These values would just be compared against the result of
operations, as in:

  void handle_read(error_code ec)
  {
    if (ec == boost::asio::error::operation_aborted)
      ...
  }

Whether the underlying error is an errno or a sysno isn't
relevant to these use cases.

Cheers,
Chris


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk