try/catch idiom in std.datetime
Jonathan M Davis
jmdavisProg at gmx.com
Mon Nov 18 13:16:33 PST 2013
On Monday, November 18, 2013 12:18:31 Walter Bright wrote:
> I agree. But I'll add that it would be even better to redesign FracSec.from
> so it never throws at all - have it assert(0) for invalid values being
> passed to it.
>
> Exceptions should not be thrown for invalid arguments. Data validation
> should be handled separately.
I think that that depends. In some cases, it would just mean duplicating work
if the API expected the caller to verify the arguments' validity first. A prime
example of this would be functions which parse strings. It would be highly
inefficient for a function like fromISOExtString to assert instead of enforcing.
The caller would have to do the exact work that the function has to do in
order to do the check, so it's just wasteful to expect the caller to ensure
the validity of the input.
Constructors for types like SysTime or DateTime are in a bit more of a grey
area in that in most cases what's passed is likely to be valid - e.g.
hopefully, when someone gives a date, they have some clue that the date is
valid ahead of time. However, there are cases where the caller really has no
way of knowing ahead of time whether a date is going to be valid or not - e.g.
is February 29th a valid date in year X? A function could be provided to check
the validity ahead of time, but that puts a greater burden on the caller and
ends up duplicating the checks. It also would have created more code
duplication in std.datetime in some places, because the checks would have to
be put in more places rather than having them in a centralized location (e.g.
Date's constructor can check the validity of the values, and DateTime can just
take advantage of that rather than having to duplicate the check). I do
acknowledge however that it's a grey area.
In general, std.datetime takes a defensive programming approach rather than
the DbC approach with the idea that it's often likely that the input is going
to be originate from a user or file and that many of the checks have to be done
regardless, so asking the programmer to do them just adds overhead. In some
cases, it arguably should have used DbC, but there were enough places that it
should have been using defensive programming already that it was more
consistent to use defensive programming in any of the grey areas.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list