|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2006-06-27 07:39:48
Oliver.Kowalke_at_[hidden] wrote:
> Hello,
> creating a system_error requires :
>
> sys::error_code e( errno, sys::from_errno);
> std::string msg;
> sys::system_message( e, msg);
> sys::system_error( msg, e);
>
> I would find it easier if I had only to type:
>
> sys::error_code e( errno, sys::from_errno);
> sys::system_error( e); // what() == system_message
I agree.
system_error::system_error should have its arguments reversed and what_arg
should be optional. The postcondition of what() indicates that this might
have been the intent all along.
In addition, I think that the setters in error_code need to be dropped. In
the rare situations where an error_code is already available and needs to be
repurposed (a questionable activity as its original contents would be lost),
instead of:
e.sysno_value( sv );
one would use:
e = error_code( sv );
The postconditions of the constructors need to be changed to:
sysno_value() == err && errno_value() == to_errno( err );
and
errno_value() == err && sysno_value() == to_sysno( err );
respectively. sysno_value() and errno_value() now would need no further
(normative) explanations.
The postcondition of error() is ill-formed as currently given and -- in case
error() is provided at all (questionable) -- needs to be just errno_value()
== 0.
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.
This would help code reviewers as in:
sys::error_code e( r, sys::from_sysno );
it is now explicit that r is supposed to hold a system error code.
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.
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 I want to
compare the system error codes, let me do so explicitly:
e1.sysno_value() == e2.sysno_value()
This also helps code reviewers. Having an operator== for which e1 == e2
doesn't necessarily imply that e1 and e2 are equivalent would need much
explanation.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk