Nothrow functions
Janderson
ask at me.com
Thu Oct 2 08:19:15 PDT 2008
Janderson wrote:
> 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
Maybe there should be some sort of way to detect handles that are not
RAII handled in the constructor?
-Joel
More information about the Digitalmars-d
mailing list