[phobos] enforce() improvement

Andrei Alexandrescu andrei at erdani.com
Thu Jul 1 10:45:59 PDT 2010


I think alwaysAssert(expr) can be emulated with relative ease as expr || 
assert(false).

Andrei

David Simcha wrote:
> Should we put a separate alwaysAssert() function into Phobos that does 
> output the line number and file, and then remove this from enforce()?  I 
> see two use cases for enforce:  As a function that asserts even in 
> release mode, and for real error handling.
> 
> I tend to use enforce in a lot of places where I would otherwise use 
> assert, but want to leave the check on in release mode.  I find that I 
> very frequently don't want every array access bounds checked or 
> expensive asserts checked, but still want the asserts that have 
> negligible performance cost to be checked even in release mode.  
> However, using enforce() like this sometimes devalues it for "real" 
> error handling because you can't catch the exception it throws without 
> possibly catching what's logically an assert error.
> 
> On Thu, Jul 1, 2010 at 1:15 PM, Steve Schveighoffer <schveiguy at yahoo.com 
> <mailto:schveiguy at yahoo.com>> wrote:
> 
>     User: your application exited with an error message
>     Developer: What was the message?
>     User: Need nonnegative i
>     Developer:  Well, don't pass in a negative i then!
> 
>     :)
> 
>     -Steve
> 
> 
> 
>     ----- Original Message ----
>      > From: Lars Tandle Kyllingstad <lars at kyllingen.net
>     <mailto:lars at kyllingen.net>>
>      > To: Discuss the phobos library for D <phobos at puremagic.com
>     <mailto:phobos at puremagic.com>>
>      > Sent: Thu, July 1, 2010 10:15:36 AM
>      > Subject: Re: [phobos] enforce() improvement
>      >
>      > The library user would still get the information,
>      > because
>     Throwable.toString() would still give the file and line number, and
>      > like
>     I said, Throwable.file and Throwable.line are supposed to be filled
>      > with
>     that information.  My point was that enforce() puts the information
>      > in
>     Throwable.msg, which I find completely redundant.
> 
>     Also, if you are
>      > using plain enforce() for error checking (like Phobos
>     does in a lot of
>      > places), Throwable.msg is your only source of
>     information to pass to the
>      > user, since enforce() by default throws an
>     Exception and not an
>      > InsightfulInformationException.
> 
>     -Lars
> 
> 
> 
>     On Thu, 2010-07-01
>      > at 07:00 -0700, Steve Schveighoffer wrote:
>      > I disagree.  The "user"
>      > in this case, is the user of the library code.  He does in fact
>     need to
>      > know the file/line that caused the problem, and more useful would
>     be the full
>      > stack trace so he can see where his code used the offending value.
>      >
>      >
>      > If you are relying on enforce to give insightful error messages to an
>      > actual user (that is, someone who runs your program), then you
>     need some
>      > training in user interface design :)
>      >
>      > -Steve
>      >
>      >
>      >
>      >
>      > ----- Original Message ----
>      > > From: Lars Tandle
>      > Kyllingstad <
>      > href="mailto:lars at kyllingen.net
>     <mailto:lars at kyllingen.net>">lars at kyllingen.net
>     <mailto:lars at kyllingen.net>>
>      > > To:
>      > Phobos mailing list <
>      > href="mailto:phobos at puremagic.com
>     <mailto:phobos at puremagic.com>">phobos at puremagic.com
>     <mailto:phobos at puremagic.com>>
>      > >
>      > Sent: Thu, July 1, 2010 9:50:15 AM
>      > > Subject: [phobos] enforce()
>      > improvement
>      > >
>      > > Often, at least in small programs, when
>      > an exception is thrown you just
>      > want
>      > > to present a sensible
>      > message to the user and abort the
>      > > current
>      > operation.
>      > Example:
>      >
>      >         void
>      > >
>      > doStuff(int i) { enforce(i >= 0, "Need nonnegative i"); }
>      >
>      >
>      >
>      > >       try
>      > doStuff(-1);
>      >         catch
>      > > (Exception
>      > e) writeln("Error: ", e.msg);
>      >
>      > In this case, the user will
>      >
>      > > see
>      >
>      >         Error: b.d(5):
>      > Need nonnegative
>      > > i
>      >
>      > My point is that the user
>      > doesn't need to see the file and line
>      > > number
>      > that caused
>      > the error.  This is only useful for the
>      > > programmer.  So
>      > I
>      > suggest we make either of the following changes to
>      > >
>      > enforce():
>      >
>      >      1. Drop the file and line number
>      > from the
>      > > message.  The Throwable
>      >
>      >    class has dedicated
>      > > 'file' and 'line' fields which we
>      > can
>      >         populate
>      > > with that
>      > information without polluting the error
>      >
>      >
>      > > message.
>      >      2. Another option is to
>      > include the file and line
>      > > only in debug
>      >
>      >      builds.
>      >
>      > -Lars
>      > >
>      >
>      >
>      >
>      > _______________________________________________
>      > phobos mailing
>      >
>      > > list
>      >
>      > > href="mailto:
>      > ymailto="mailto:phobos at puremagic.com <mailto:phobos at puremagic.com>"
>      > href="mailto:phobos at puremagic.com
>     <mailto:phobos at puremagic.com>">phobos at puremagic.com
>     <mailto:phobos at puremagic.com>">
>      > ymailto="mailto:phobos at puremagic.com <mailto:phobos at puremagic.com>"
>      > href="mailto:phobos at puremagic.com
>     <mailto:phobos at puremagic.com>">phobos at puremagic.com
>     <mailto:phobos at puremagic.com>
>      >
>      > http://lists.puremagic.com/mailman/listinfo/phobos
>      >
>      >
>      >
>      >
>      >
>      > _______________________________________________
>      > phobos mailing
>      > list
>      >
>      > href="mailto:phobos at puremagic.com
>     <mailto:phobos at puremagic.com>">phobos at puremagic.com
>     <mailto:phobos at puremagic.com>
>      >
>      > href="http://lists.puremagic.com/mailman/listinfo/phobos"
>     target=_blank
>      > >http://lists.puremagic.com/mailman/listinfo/phobos
> 
> 
>     _______________________________________________
>     phobos
>      > mailing list
> 
>      > href="mailto:phobos at puremagic.com
>     <mailto:phobos at puremagic.com>">phobos at puremagic.com
>     <mailto:phobos at puremagic.com>
> 
>      > href="http://lists.puremagic.com/mailman/listinfo/phobos"
>     target=_blank
>      > >http://lists.puremagic.com/mailman/listinfo/phobos
> 
> 
> 
>     _______________________________________________
>     phobos mailing list
>     phobos at puremagic.com <mailto:phobos at puremagic.com>
>     http://lists.puremagic.com/mailman/listinfo/phobos
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos


More information about the phobos mailing list