enforce()?

Steven Schveighoffer schveiguy at yahoo.com
Wed Jun 16 03:55:21 PDT 2010


On Wed, 16 Jun 2010 05:28:46 -0400, Ary Borenszweig <ary at esperanto.org.ar>  
wrote:

> On 06/16/2010 04:15 PM, Walter Bright wrote:
>> Ali Çehreli wrote:
>>> bearophile wrote:
>>>> I have counted about 200 usages of std.contracts.enforce() inside
>>>> Phobos. Can you tell me what's the purpose of enforce() in a language
>>>> that has built-in Contract Programming?
>>>
>>> I can see two benefits:
>>
>> The difference is not based on those 3 points, but on what Andrei wrote
>> here. Contracts and error checking are completely distinct activities
>> and should not be conflated.
>
> Could you please explain them? There are many people here that don't  
> understand the difference between these two concepts (including me). So  
> maybe we are too dumb, maybe those concepts are not generally known or  
> maybe the explanation is not very well clear in the documentation.

I think of enforce as a convenient way translating an error in an  
expectation to an exception in a single expression.

For example, take some system call that returns -1 on error, you could do  
this:

if(result < 0)
    throw new Exception("oops!");

or you could do this:

enforce(result >= 0, "oops!");

Think of enforce as "throw if"

And in fact, I think there's an errnoEnforce which throws a standard  
exception with the string error from the system.

I'd say the difference between enforce and assert is exactly what Andrei  
said -- enforce is meant to catch errors that can occur during normal  
operation.  Assert is meant to catch errors that are not expected during  
normal operation.  Assert's more like a sanity check.  Also, assert is  
turned off in release mode, enforce is left on.

-Steve




More information about the Digitalmars-d mailing list