Nothrow functions

Janderson ask at me.com
Thu Oct 2 08:04:10 PDT 2008


Andrei Alexandrescu wrote:
> Janderson wrote:
>> Andrei Alexandrescu wrote:
>>> dsimcha wrote:
>>>> == Quote from Janderson (ask at me.com)'s article
>>>>> Walter Bright wrote:
>>>> http://www.reddit.com/r/programming/comments/74fx4/nothrow_functions_in_the_d_programming_language/ 
>>>>
>>>>> Perhaps now constructors can enforce no-throw.  Functions that have
>>>>> throw would have to be handled in that constructor.  Of course we 
>>>>> could
>>>>> always do this manually, but it might be worth considering making 
>>>>> on by
>>>>> default for constructors.
>>>>> -Joel
>>>>
>>>> Please, please, please, please, *please* no!!!  Anything that is in 
>>>> any way
>>>> similar to checked exception Hell in Java does not belong in D.  
>>>> Nothrow is a
>>>> great feature precisely because, by being a contract that is only 
>>>> enforced when
>>>> the programmer explicitly asks for it to be, it can be simply 
>>>> ignored in places
>>>> where one doesn't want to use it.  Making nothrow the default in 
>>>> constructors
>>>> really smacks of Java-style bondage and discipline, and a major 
>>>> reason why I use D
>>>> is to avoid such things.  If nothrow is the default *anywhere*, it 
>>>> will lead to
>>>> aggravation and error swallowing similar to Java's checked exceptions.
>>>
>>> I agree. Bondage and discipline, heh :o). I'm actually surprised at 
>>> the desire of making most constructors nothrow. Why?
>>>
>>> Andrei
>>
>> If an exception fires during the construction of an object and you 
>> don't handle it your left with a partially formed object.  It becomes 
>> difficult to then make that object an invariant.  This is particularly 
>> bad when it occurs in the base classes constructor.
> 
> But C++ solved this by making it impossible to obtain a 
> partially-constructed object. If the constructor throws, there's never 
> an object to talk about.
> 
> Andrei

That's a good point, I guess the issue I've had in the past is with 
resource handles and dangling pointers.

What if the object creates a handle to a resource in the constructor 
just before the exception.  That resource never gets cleaned up unless 
your explicitly handle it with a try-catch.  Other then the out of 
memory one, I'm not aware of any C++ standard library that throw in the 
constructor.

-Joel



More information about the Digitalmars-d mailing list