Let's approach the problem from the design point of view. What
information are we trying to relay here?
1) is the result a success or failure? (true/false)
2) what kind of success (if it is success)?
3) what kind of error (if it is an error)?
(a) relies on specific code ranges (e.g., 2xx) to support (1) and
supports (2) and (3) via specific code values (e.g., 404)
(d) relies on the presence of Error parameter to support (1) and
does not support (2) and
supports (3) via specific code values (e.g., 404)
(e) relies on the outcome "sign" to support (1) and
supports (2) and (3) via specific code values (e.g., 404)
(e) is clearly better than (a) from the design point of view because
it is symmetric, but (a) is what people are used to. (d) lacks
functionality that might be needed for extensions.
Comparing (e) with (a), (a) remains my favorite. I got used to the specific
code range meanings.
Should we go with (a)?
I say: yes, let's go with (a).
Martin