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.<br>
<br>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&#39;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 &quot;real&quot; error handling because you can&#39;t catch the exception it throws without possibly catching what&#39;s logically an assert error.<br>
<br><div class="gmail_quote">On Thu, Jul 1, 2010 at 1:15 PM, Steve Schveighoffer <span dir="ltr">&lt;<a href="mailto:schveiguy@yahoo.com">schveiguy@yahoo.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
User: your application exited with an error message<br>
Developer: What was the message?<br>
User: Need nonnegative i<br>
Developer:  Well, don&#39;t pass in a negative i then!<br>
<div class="im"><br>
:)<br>
<br>
-Steve<br>
<br>
<br>
<br>
----- Original Message ----<br>
&gt; From: Lars Tandle Kyllingstad &lt;<a href="mailto:lars@kyllingen.net">lars@kyllingen.net</a>&gt;<br>
</div><div><div></div><div class="h5">&gt; To: Discuss the phobos library for D &lt;<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&gt;<br>
&gt; Sent: Thu, July 1, 2010 10:15:36 AM<br>
&gt; Subject: Re: [phobos] enforce() improvement<br>
&gt;<br>
&gt; The library user would still get the information,<br>
&gt; because<br>
Throwable.toString() would still give the file and line number, and<br>
&gt; like<br>
I said, Throwable.file and Throwable.line are supposed to be filled<br>
&gt; with<br>
that information.  My point was that enforce() puts the information<br>
&gt; in<br>
Throwable.msg, which I find completely redundant.<br>
<br>
Also, if you are<br>
&gt; using plain enforce() for error checking (like Phobos<br>
does in a lot of<br>
&gt; places), Throwable.msg is your only source of<br>
information to pass to the<br>
&gt; user, since enforce() by default throws an<br>
Exception and not an<br>
&gt; InsightfulInformationException.<br>
<br>
-Lars<br>
<br>
<br>
<br>
On Thu, 2010-07-01<br>
&gt; at 07:00 -0700, Steve Schveighoffer wrote:<br>
&gt; I disagree.  The &quot;user&quot;<br>
&gt; in this case, is the user of the library code.  He does in fact need to<br>
&gt; know the file/line that caused the problem, and more useful would be the full<br>
&gt; stack trace so he can see where his code used the offending value.<br>
&gt;<br>
&gt;<br>
&gt; If you are relying on enforce to give insightful error messages to an<br>
&gt; actual user (that is, someone who runs your program), then you need some<br>
&gt; training in user interface design :)<br>
&gt;<br>
&gt; -Steve<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; ----- Original Message ----<br>
&gt; &gt; From: Lars Tandle<br>
&gt; Kyllingstad &lt;<br>
</div></div><div class="im">&gt; href=&quot;mailto:<a href="mailto:lars@kyllingen.net">lars@kyllingen.net</a>&quot;&gt;<a href="mailto:lars@kyllingen.net">lars@kyllingen.net</a>&gt;<br>
&gt; &gt; To:<br>
&gt; Phobos mailing list &lt;<br>
</div><div><div></div><div class="h5">&gt; href=&quot;mailto:<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&quot;&gt;<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&gt;<br>
&gt; &gt;<br>
&gt; Sent: Thu, July 1, 2010 9:50:15 AM<br>
&gt; &gt; Subject: [phobos] enforce()<br>
&gt; improvement<br>
&gt; &gt;<br>
&gt; &gt; Often, at least in small programs, when<br>
&gt; an exception is thrown you just<br>
&gt; want<br>
&gt; &gt; to present a sensible<br>
&gt; message to the user and abort the<br>
&gt; &gt; current<br>
&gt; operation.<br>
&gt; Example:<br>
&gt;<br>
&gt;         void<br>
&gt; &gt;<br>
&gt; doStuff(int i) { enforce(i &gt;= 0, &quot;Need nonnegative i&quot;); }<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; &gt;       try<br>
&gt; doStuff(-1);<br>
&gt;         catch<br>
&gt; &gt; (Exception<br>
&gt; e) writeln(&quot;Error: &quot;, e.msg);<br>
&gt;<br>
&gt; In this case, the user will<br>
&gt;<br>
&gt; &gt; see<br>
&gt;<br>
&gt;         Error: b.d(5):<br>
&gt; Need nonnegative<br>
&gt; &gt; i<br>
&gt;<br>
&gt; My point is that the user<br>
&gt; doesn&#39;t need to see the file and line<br>
&gt; &gt; number<br>
&gt; that caused<br>
&gt; the error.  This is only useful for the<br>
&gt; &gt; programmer.  So<br>
&gt; I<br>
&gt; suggest we make either of the following changes to<br>
&gt; &gt;<br>
&gt; enforce():<br>
&gt;<br>
&gt;      1. Drop the file and line number<br>
&gt; from the<br>
&gt; &gt; message.  The Throwable<br>
&gt;<br>
&gt;    class has dedicated<br>
&gt; &gt; &#39;file&#39; and &#39;line&#39; fields which we<br>
&gt; can<br>
&gt;         populate<br>
&gt; &gt; with that<br>
&gt; information without polluting the error<br>
&gt;<br>
&gt;<br>
&gt; &gt; message.<br>
&gt;      2. Another option is to<br>
&gt; include the file and line<br>
&gt; &gt; only in debug<br>
&gt;<br>
&gt;      builds.<br>
&gt;<br>
&gt; -Lars<br>
&gt; &gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; phobos mailing<br>
&gt;<br>
&gt; &gt; list<br>
&gt;<br>
&gt; &gt; href=&quot;mailto:<br>
</div></div>&gt; ymailto=&quot;mailto:<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&quot;<br>
<div class="im">&gt; href=&quot;mailto:<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&quot;&gt;<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&quot;&gt;<br>
</div>&gt; ymailto=&quot;mailto:<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&quot;<br>
<div class="im">&gt; href=&quot;mailto:<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&quot;&gt;<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a><br>
&gt;<br>
&gt; <a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; phobos mailing<br>
&gt; list<br>
&gt;<br>
&gt; href=&quot;mailto:<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&quot;&gt;<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a><br>
&gt;<br>
</div>&gt; href=&quot;<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a>&quot; target=_blank<br>
<div class="im">&gt; &gt;<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
<br>
<br>
_______________________________________________<br>
phobos<br>
&gt; mailing list<br>
<br>
&gt; href=&quot;mailto:<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a>&quot;&gt;<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a><br>
<br>
</div>&gt; href=&quot;<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a>&quot; target=_blank<br>
<div><div></div><div class="h5">&gt; &gt;<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
<br>
<br>
<br>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
</div></div></blockquote></div><br>