Throwing specific Error Obejct for asserts

Simen Kjaeraas simen.kjaras at gmail.com
Thu Jan 10 11:30:58 PST 2013


On 2013-01-10, 19:03, monarch_dodra wrote:

> On Thursday, 10 January 2013 at 17:46:54 UTC, Dmitry Olshansky wrote:
>> 10-Jan-2013 20:11, monarch_dodra пишет:
>>> On Thursday, 10 January 2013 at 15:54:21 UTC, Andrei Alexandrescu  
>>> wrote:
>>>> On 1/10/13 6:23 AM, monarch_dodra wrote:
>>>>> So question: Why don't we have, just like for enforce, the  
>>>>> possibility
>>>>> of simply writing:
>>>>> //----
>>>>> assert(i <= j, new RangeError());
>>>>> //----
>>>>
>>>> Define another function...?
>>>>
>>>> Andrei
>>>
>>> Well, I would. I'd write an overload, but I can't, because assert is
>>> built-in.
>>>
>>> I'd have to provide a new name (such as assertError). This would not be
>>> as convenient as having an overload. That, and a library function can't
>>> match assert's built-in functionality. For example:
>>>
>>> //----
>>> struct S()
>>> {
>>>   version(assert)
>>>     bool isValid = false; //debug only variable
>>>
>>>   void foo()
>>>   {
>>>     assertError(isValid, new RangeError()); //HERE
>>>   }
>>> }
>>> //----
>>>
>>> The problem is that at best, assertError can be a noop-implementation  
>>> in
>>> release, but the call is still there. The first argument will still get
>>> evaluated. Further more, it may not even compile...
>>
>> lazy keyword to the rescue.
>
> Still doesn't compile though...


So you're saying this does compile for you, with -release?

struct S( ) {
     version(assert)
         bool isValid = false;

     void foo() {
         assert(isValid);
     }
}

It certainly does not for me.

-- 
Simen


More information about the Digitalmars-d mailing list